forum.webdiplomacy.net

webDip dev coordination forum / public access todo list
It is currently Tue Apr 24, 2018 6:41 am

All times are UTC




Post new topic Reply to topic  [ 10 posts ] 
Author Message
PostPosted: Sun Feb 28, 2010 5:34 pm 
Offline

Joined: Wed Jul 29, 2009 10:22 am
Posts: 841
Hi everybody.

Solved the problem with the computer-player in my current map. But there is one more.

The map has a special-commando called "transform". You can transform your army on a coast into an fleet and vice versa.
For the adjucation I think it would be enough to generate a "move" order for your "own" territory (or "North/South"-Coast), but I have no clue about the javascript order generation to add a new command. To be fair, I even have no clue about javascript in general.

Any thoughts on this? How would you start.

Oliver


Top
 Profile  
 
PostPosted: Sun Feb 28, 2010 7:55 pm 
Offline

Joined: Wed Oct 08, 2008 12:47 pm
Posts: 726
I don't know how the javascript interface works, but I do know about javascript itself.

However, I would have thought that they way to solve this problem is probably to expand the framework, because otherwise anything you do will just be a hack.


Top
 Profile  
 
PostPosted: Sun Feb 28, 2010 8:12 pm 
Offline

Joined: Wed Jul 29, 2009 10:22 am
Posts: 841
It shouldn't be that big "hack".
The code to select the orders should be extendble as it is I just don't know how, because I have no clue about javascript. Also it's not hard o catch a special "Move" order and replace the command with what I really meant.
Also I really dislike to mess with the original-code.

Oliver


Top
 Profile  
 
PostPosted: Sun Feb 28, 2010 11:24 pm 
Offline

Joined: Wed Oct 08, 2008 12:47 pm
Posts: 726
That's why I was suggesting that instead the standard framework be extended.
Well, on that logic why not create a territory called "Transformation", then as you say catch
every move to that place and act accordingly.
That would turn it into a php issue rather than javascript.


Top
 Profile  
 
PostPosted: Mon Mar 01, 2010 6:36 am 
Offline

Joined: Wed Jul 29, 2009 10:22 am
Posts: 841
Very good idea.
Should work till I get some basic javascript-knowledge.

Oliver


Top
 Profile  
 
PostPosted: Mon Mar 01, 2010 9:07 am 
Offline

Joined: Wed Oct 08, 2008 12:47 pm
Posts: 726
For a 'propper' version, I think it would be good to add an 'Other' order type.
This would then be used generically by variants who could populate it with any special rule they may have.


Top
 Profile  
 
PostPosted: Sun Mar 07, 2010 8:18 pm 
Offline

Joined: Wed Jul 29, 2009 10:22 am
Posts: 841
Ok. Did a little research on this.
I need help with the following code:
Code:

function loadOrdersPhase() {
   MyOrders.map(function(OrderObj) {

         OrderObj.convoyPath=$A([ ]);
         
         OrderObj.postUpdate=function() {
            // We may need to generate the convoy path to help the server-side order validator
            
            var convoyPath = $A([ ]);
            
            if( this.isComplete && !Object.isUndefined(this.Unit.convoyOptions) )
            {
               if( this.type=='Move' && this.Unit.convoyOptions.any(function(c){ return (c==this.toTerrID); },this) )
               {
                  convoyPath = this.Unit.ConvoyGroup.pathArmyToCoast(this.Unit.Territory, this.ToTerritory);
               }
               else if( this.type=='Support move' && this.Unit.convoyOptions.any(function(c){ return (c==this.fromTerrID); },this) )
               {
                  if( this.Unit.type=='Fleet' )
                  {
                     convoyPath = this.ToTerritory.ConvoyGroup.pathArmyToCoastWithoutFleet(
                           this.FromTerritory, this.ToTerritory, this.Unit.Territory
                        );
                  }
                  else
                  {
                     convoyPath = this.ToTerritory.ConvoyGroup.pathArmyToCoast(this.FromTerritory, this.ToTerritory);
                  }
               }
               else if( this.type=='Convoy' && this.Unit.convoyOptions.any(function(c){ return (c==this.fromTerrID); },this) )
               {
                  convoyPath = this.Unit.ConvoyGroup.pathArmyToCoastWithFleet(this.FromTerritory, this.ToTerritory, this.Unit.Territory);
                  if( Object.isUndefined(convoyPath) )
                     this.wipe(['toTerrID','fromTerrID']);
               }
            }
            
            this.convoyPath = convoyPath;
            
            
            /*
             * Now we need to perform auto-fill functionality, if it is enabled
             * (it may be disabled for DATC tests)
             */ 
            if( false && this.autoFill ) {
               
               var thisOrder=this;
               var filterSet=function(fFilter,fSet) { MyOrders.select(fFilter).map(fSet); };
               
               if( Object.isUndefined(this.setAndShow) ) {
                  MyOrders.map(function(o){
                     o.setAndShow=function(n,v){ o.inputValue(n,v); o.reHTML(n); };
                  });
               }
               
               switch( this.type ) {
                  case "Support hold":
                     if( this.isComplete ) {
                        filterSet(function(o) {
                           return( o.Unit.Territory.id==thisOrder.ToTerritory.id && o.type=='Move' );
                        }, function(o){
                           o.setAndShow('type','Hold');
                        });
                     }
                     break;
                     
                  case "Support move":
                     if( !Object.isUndefined(this.ToTerritory) ) {
                        // We have toTerr, where we are supporting to

                        MyOrders.select(function(o) {
                           return( o.Unit.Territory.id==thisOrder.ToTerritory.id && o.type!='Move' );
                        }).map(function(o){
                           o.setAndShow('type','Move');
                        });
                     }
                     
                     if( !Object.isUndefined(this.FromTerritory) ) {
                        // We have fromTerr, where we are supporting from

                        MyOrders.map(function(o) {
                           var convoyingArmyList=MyOrders.select(function(o) {
                              return( o.Unit.Territory.id==thisOrder.FromTerritory.id );
                           });
                           
                           convoyingArmyList.map(function(o){
                              o.setAndShow('type','Move');
                           });
                           
                           convoyingArmyList.select(function(o) {
                              return( Object.isUndefined(o.ToTerritory)||o.ToTerritory.id!=thisOrder.ToTerritory.id );
                           }).map(function(o){
                              o.setAndShow('toTerrID',thisOrder.ToTerritory.id.toString());
                           });
                        },this);
                     }
                     
                     break;
                  
                  case "Convoy":
                     if( !Object.isUndefined(this.ToTerritory) ) {
                        // We have toTerr, where we are convoying to
                        
                        // If it's one of ours it had better move (had it?)
                        MyOrders.select(function(o) {
                           return ( o.Unit.Territory.id==thisOrder.ToTerritory.id && o.type!='Move' );
                        }).map(function(o){
                           setVal(o,'type','Move');
                        });
                     }
                     
                     if( !Object.isUndefined(this.FromTerritory) ) {
                        // We have fromTerr, where we are convoying from

                        // If it's one of ours it had better move to where we're convoying it
                        MyOrders.select(function(o){
                           return (o.Unit.Territory.id==thisOrder.FromTerritory.id);
                        }).map(function(o){
                           setVal(o,'type','Move');
                           setVal(o,'toTerrID',thisOrder.ToTerritory.id.toString());
                           setVal(o,'viaConvoy','Yes');
                        });
                     }
                     break;
               }
            }
         };
         
         OrderObj.updaterequirements = function () {
         
            var oldrequirements = this.requirements;
            
            switch( this.type ) {
               case 'Move':
                  this.requirements = [ 'type','toTerrID','viaConvoy' ];
                  break;
               case 'Support hold':
                  this.requirements = [ 'type','toTerrID' ];
                  break;
               case 'Support move':
                  this.requirements = [ 'type','toTerrID','fromTerrID' ];
                  break;
               case 'Convoy':
                  this.requirements = [ 'type','toTerrID','fromTerrID' ];
                  break;
               default:
                  this.requirements = ['type'];
            }
            
            this.wipe(oldrequirements.reject(function(r){return this.requirements.member(r);},this));
            
         };
         
         OrderObj.updateTypeChoices = function () {
            this.typeChoices = {
               'Hold': 'hold', 'Move': 'move', 'Support hold': 'support hold', 'Support move': 'support move'
            };
            
            if( this.Unit.type == 'Fleet' && this.Unit.Territory.type == 'Sea' )
               this.typeChoices['Convoy']='convoy';
            
            return this.typeChoices;
         };
         
         OrderObj.updateToTerrChoices = function () {
            switch( this.type ) {
               case 'Move':
                  this.toTerrChoices = this.Unit.getMoveChoices();
                  
                  if( this.Unit.type=='Army' && this.Unit.Territory.type=='Coast' )
                  {
                     var ttac = new Hash();
                     var armylocalchoices = this.Unit.Territory.getBorderTerritories().pluck('id');
                     this.toTerrChoices.map(
                           function(c) {
                              if( armylocalchoices.member(c) )
                                 ttac.set(c, Territories.get(c).name);
                              else
                                 ttac.set(c, Territories.get(c).name+' (via convoy)');
                           }
                        );
                     this.toTerrChoices = ttac;
                     
                     return this.toTerrChoices;
                  }
                  break;
               case 'Support hold': this.toTerrChoices = this.Unit.getSupportHoldChoices(); break;
               case 'Support move': this.toTerrChoices = this.Unit.getSupportMoveToChoices(); break;
               case 'Convoy': this.toTerrChoices = this.Unit.getConvoyToChoices(); break;
               default: this.toTerrChoices = undefined; return;
            }
            
            this.toTerrChoices=this.arrayToChoices(this.toTerrChoices);
            
            return this.toTerrChoices;
         };
         
         OrderObj.updateFromTerrChoices = function () {
            if( Object.isUndefined(this.ToTerritory) )
            {
               this.fromTerrChoices = undefined;
            }
            else
            {
               switch( this.type ) {
                  case 'Support move': this.fromTerrChoices = this.Unit.getSupportMoveFromChoices(this.ToTerritory); break;
                  case 'Convoy': this.fromTerrChoices = this.Unit.getConvoyFromChoices(this.ToTerritory); break;
                  default: this.fromTerrChoices = undefined; return;
               }
            }
            
            this.fromTerrChoices=this.arrayToChoices(this.fromTerrChoices);
            
            return this.fromTerrChoices;
         };
         
         OrderObj.updateViaConvoyChoices = function () {
            if( this.type!='Move' || this.toTerrID=='' )
               this.viaConvoyChoices=undefined;
            else if( this.Unit.type!='Army' || !this.Unit.convoyLink || !this.Unit.ConvoyGroup.Coasts.member(this.ToTerritory) )
               this.viaConvoyChoices=new Hash({'No': 'via land'});
            else if( this.Unit.getMovableTerritories().member(this.ToTerritory) )
               this.viaConvoyChoices=new Hash({'Yes': 'via convoy', 'No': 'via land'});
            else
               this.viaConvoyChoices=new Hash({'Yes': 'via convoy'});
            
            return this.viaConvoyChoices;
         };
         
         OrderObj.beginHTML = function () {
            return 'The '+this.Unit.type.toLowerCase()+' at '+this.Unit.Territory.name+' ';
         };
         OrderObj.typeHTML = function () {
            return this.formDropDown('type',this.typeChoices,this.type);
         };
         OrderObj.toTerrHTML = function () {
            var toTerrID=this.formDropDown('toTerrID',this.toTerrChoices,this.toTerrID);
            
            if( toTerrID == '' ) return '';
            
            var ToUnitType;
            if( Object.isUndefined(this.ToTerritory) || Object.isUndefined(this.ToTerritory.Unit) )
               ToUnitType = 'unit';
            else
               ToUnitType = this.ToTerritory.Unit.type.toLowerCase();
               
            switch(this.type) {
               
               case 'Move': return ' to '+toTerrID;
               case 'Support hold': return ' the '+ToUnitType+' in '+toTerrID;
               case 'Support move': return ' to '+toTerrID;
               case 'Convoy': return ' an army to '+toTerrID;
               default: return '';
            }
         };
         OrderObj.fromTerrHTML = function () {
            if( this.toTerrID == '' ) return '';
            
            var fromTerrID=this.formDropDown('fromTerrID',this.fromTerrChoices,this.fromTerrID);
               
            switch(this.type) {
               case 'Support move': return ' from '+fromTerrID;
               case 'Convoy': return ' from '+fromTerrID;
               default: return '';
            }
         };
         OrderObj.viaConvoyHTML = function () {
            if( Object.isUndefined(this.viaConvoyChoices) )
               return '';
            else if ( this.viaConvoyChoices.values().length==1 )
               return '<input type="hidden" name="orderForm['+this.id+'][viaConvoy]" value="'+this.viaConvoyChoices.values()[0]+'" />';
            else
               return this.formDropDown('viaConvoy',this.viaConvoyChoices,this.viaConvoy);
         };
         
         OrderObj.load();
      });
}


I need a function that I can call after this (loadOrdersPhase()) has been loaded and change the behaviour of the checkboxes to add an "Transform" option to all Coastal provinces with a SC.

Oliver


Top
 Profile  
 
PostPosted: Sun Mar 07, 2010 11:47 pm 
Offline

Joined: Wed Oct 08, 2008 12:47 pm
Posts: 726
Why not genuinely make the territory & add the links?


Top
 Profile  
 
PostPosted: Mon Mar 08, 2010 5:58 am 
Offline

Joined: Wed Jul 29, 2009 10:22 am
Posts: 841
I did that and it works so far.
But I really would like to hide this workaround from the user and present the new command in the command-selection.

Oliver


Top
 Profile  
 
PostPosted: Thu Mar 11, 2010 5:11 am 
Offline
Site Admin

Joined: Sat Jun 28, 2008 6:24 am
Posts: 892
Unfortunately the order generation JS was written right in the middle of last semester out of necessity, and it was my first JS project, so it's horribly rushed and hacked up. It's inefficient, unstructured and uncommented (but still much better than what came before), which makes extending it (elegantly) something that at the moment I have no idea how you would do, because I can't really remember in much detail how it all works.

Really it needs a good going over and reorganizing, with some stuff to let variants hook in more elegantly as can be done server-side, but in reality unlike with PHP I'm definitely a JavaScript rookie (especially when it comes to its prototype based inheritance, which I would need to understand very well to design something good for this purpose)

For now I'd say wait, then when I get the time to go through and get all this stuff nice and neat I'll build in something for variant devs to alter the functionality in a tidy way


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 10 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group