-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

ok, after discussing it a little more with soliton and Dragonking, here
is one more attempt at slo

- - slowed units see their movement halved
        actually, movement is not halved, but movement cost is double
        this effect was already here before
- - slowed units emit no ZoC
- - slowed units have one less attack
        this effect was already there
- - slow is cured when resting or being on a village
        curers/healers don't help. only resting or staying on a village
        slow does not interact with poison or healing in anyway.


here you go

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFDawe0SBeC9Fa95UURAkW/AJ9swpUZsjkH7lyFmIpioYJIqkDLuACfQzQy
p83DASLWK8IEvqrG3abpcZo=
=twRS
-----END PGP SIGNATURE-----
Index: reports.cpp
===================================================================
--- reports.cpp (révision 8705)
+++ reports.cpp (copie de travail)
@@ -126,7 +126,7 @@
                }
                if(u->second.has_flag("slowed")) {
                        unit_status << "misc/slowed.png";
-                       tooltip << _("slowed: ") << _("This unit has been 
slowed. It moves at half normal speed and receives one less attack than normal 
in combat.");
+                       tooltip << _("slowed: ") << _("This unit has been 
slowed. It moves at half normal speed , receives one less attack than normal in 
combat, and does not emit a zone of control.");
                        res.add_image(unit_status,tooltip);
                }
                if(u->second.has_flag("poisoned")) {
Index: actions.cpp
===================================================================
--- actions.cpp (révision 8705)
+++ actions.cpp (copie de travail)
@@ -1219,6 +1212,7 @@
                                           const std::vector<team>& teams)
 {
        std::map<gamemap::location,int> healed_units, max_healing;
+       std::map<gamemap::location,bool> unslowed_units;
 
        //a map of healed units to their healers
        std::multimap<gamemap::location,gamemap::location> healers;
@@ -1319,8 +1313,23 @@
                }
        }
 
+       // last, add units that need unslowing
        for(i = units.begin(); i != units.end(); ++i) {
+               //the unit heals if it's on this side, and it's on a village or
+               //it has regeneration, and it is wounded
                if(i->second.side() == side) {
+                       if( i->second.has_flag("slowed") && 
+                                       (map.gives_healing(i->first) || 
i->second.is_resting()) ){
+                               i->second.remove_flag("slowed");
+                               
unslowed_units.insert(std::pair<gamemap::location,int>( i->first, true));
+                               // add it to healed_units so it gets applied
+                               // note that insert won't add anything if it's 
already there
+                               
healed_units.insert(std::pair<gamemap::location,int>( i->first, 0));
+                       }
+               }
+       }
+       for(i = units.begin(); i != units.end(); ++i) {
+               if(i->second.side() == side) {
                        if(i->second.hitpoints() < i->second.max_hitpoints() ||
                                        i->second.poisoned()){
                                if(i->second.is_resting()) {
@@ -1392,6 +1401,17 @@
 
                const int DelayAmount = 50;
 
+               // take care of unslowed units
+               if(unslowed_units[h->first]) {
+                       if(show_healing) {
+                               events::pump();
+
+                               sound::play_sound("heal.wav");
+                               SDL_Delay(DelayAmount);
+                               disp.invalidate_unit();
+                               disp.update_display();
+                       }
+               }
                LOG_NG << "unit is poisoned? " << (u.has_flag("poisoned") ? 
"yes" : "no") << ","
                        << h->second << "," << max_healing[h->first] << "\n";
 
Index: unit.cpp
===================================================================
--- unit.cpp    (révision 8705)
+++ unit.cpp    (copie de travail)
@@ -338,7 +338,6 @@
 
 void unit::end_turn()
 {
-       remove_flag("slowed");
        if((moves_ != total_movement()) && (moves_ != NOT_MOVED)){
                resting_ = false;
        }
@@ -499,7 +498,7 @@
 
 bool unit::emits_zoc() const
 {
-       return type().has_zoc() && stone() == false;
+       return type().has_zoc() && stone() == false && !has_flag("slowed");
 }
 
 bool unit::matches_filter(const config& cfg) const

Reply via email to