From cfa9cf7755860899fea0a44ceaf47b8bd4b129cd Mon Sep 17 00:00:00 2001
From: johns <>
Date: Mon, 4 Jun 2001 13:45:30 +0000
Subject: [PATCH] (make-unit),(place-unit) added. Partly written parsing
 (unit).

---
 src/unit/script_unit.cpp | 247 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 247 insertions(+)

diff --git a/src/unit/script_unit.cpp b/src/unit/script_unit.cpp
index 80b31c00c..791dfd1ed 100644
--- a/src/unit/script_unit.cpp
+++ b/src/unit/script_unit.cpp
@@ -38,6 +38,8 @@
 
 #include <stdlib.h>
 
+#include "unittype.h"
+#include "player.h"
 #include "unit.h"
 #include "ccl.h"
 
@@ -49,6 +51,9 @@
 --	Functions
 ----------------------------------------------------------------------------*/
 
+    /// Get unit-type.
+extern UnitType* CclGetUnitType(SCM ptr);
+
 /**
 **	Set hit-point regeneration
 **
@@ -75,11 +80,250 @@ local SCM CclSetHitPointRegeneration(SCM flag)
 */
 local SCM CclUnit(SCM list)
 {
+    SCM value;
+    //SCM sublist;
+    Unit* unit;
+    UnitType* type;
+    Player* player;
+    int slot;
+    int i;
+    char* str;
+
+    str=gh_scm2newstr(gh_car(list),NULL);
+    list=gh_cdr(list);
+
+    slot=strtol(str+1,NULL,16);
+    free(str);
+    unit=NULL;
+    type=NULL;
+    player=NULL;
+
+    //
+    //	Parse the list:	(still everything could be changed!)
+    //
+    while( !gh_null_p(list) ) {
+
+	value=gh_car(list);
+	list=gh_cdr(list);
+
+	if( gh_eq_p(value,gh_symbol2scm("type")) ) {
+	    type=UnitTypeByIdent(str=gh_scm2newstr(gh_car(list),NULL));
+	    free(str);
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("player")) ) {
+	    player=&Players[gh_scm2int(gh_car(list))];
+	    list=gh_cdr(list);
+
+	    DebugCheck( !type );
+	    unit=MakeUnit(type,player);
+	    unit->Removed=0;
+	    unit->Reset=0;
+	    DebugCheck( unit->Slot!=slot );
+	} else if( gh_eq_p(value,gh_symbol2scm("tile")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    unit->X=gh_scm2int(gh_car(value));
+	    unit->Y=gh_scm2int(gh_cadr(value));
+	} else if( gh_eq_p(value,gh_symbol2scm("stats")) ) {
+	    unit->Stats=&type->Stats[gh_scm2int(gh_car(list))];
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("pixel")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    unit->IX=gh_scm2int(gh_car(value));
+	    unit->IY=gh_scm2int(gh_cadr(value));
+	} else if( gh_eq_p(value,gh_symbol2scm("frame")) ) {
+	    unit->Frame=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("flipped-frame")) ) {
+	    unit->Frame=128|gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("seen")) ) {
+	    unit->SeenFrame=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("flipped-seen")) ) {
+	    unit->SeenFrame=128|gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("not-seen")) ) {
+	    unit->SeenFrame=-1;
+	} else if( gh_eq_p(value,gh_symbol2scm("direction")) ) {
+	    unit->Direction=(gh_scm2int(gh_car(list))*256)/360;
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("attacked")) ) {
+	    unit->Attacked=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("burning")) ) {
+	    unit->Burning=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("destroyed")) ) {
+	    unit->Destroyed=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("removed")) ) {
+	    unit->Removed=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("selected")) ) {
+	    unit->Selected=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("visible")) ) {
+	    str=gh_scm2newstr(gh_car(list),NULL);
+	    list=gh_cdr(list);
+	    for( i=0; i<PlayerMax && *str; ++i,++str ) {
+		if( *str=='-' || *str=='_' || *str==' ' ) {
+		    unit->Visible&=~(1<<i);
+		} else {
+		    unit->Visible|=(1<<i);
+		}
+	    }
+	} else if( gh_eq_p(value,gh_symbol2scm("constructed")) ) {
+	    unit->Constructed=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("active")) ) {
+	    unit->Active=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("mana")) ) {
+	    unit->Mana=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("hp")) ) {
+	    unit->HP=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("ttl")) ) {
+	    unit->TTL=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("bloodlust")) ) {
+	    unit->Bloodlust=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("haste")) ) {
+	    unit->Haste=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("slow")) ) {
+	    unit->Slow=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("invisible")) ) {
+	    unit->Invisible=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("flame-shield")) ) {
+	    unit->FlameShield=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("unholy-armor")) ) {
+	    unit->UnholyArmor=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("group-id")) ) {
+	    unit->GroupId=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("last-group")) ) {
+	    unit->LastGroup=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("sub-action")) ) {
+	    unit->SubAction=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("wait")) ) {
+	    unit->Wait=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("state")) ) {
+	    unit->State=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("reset")) ) {
+	    unit->Reset=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("blink")) ) {
+	    unit->Blink=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("moving")) ) {
+	    unit->Moving=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("rs")) ) {
+	    unit->Rs=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("revealer")) ) {
+	    unit->Revealer=1;
+	} else if( gh_eq_p(value,gh_symbol2scm("on-board")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("order-count")) ) {
+	    unit->OrderCount=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("order-flush")) ) {
+	    unit->OrderFlush=gh_scm2int(gh_car(list));
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("orders")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("saved-order")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("new-order")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("data-builded")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("data-reseach")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("data-upgrade-to")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("data-train")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else if( gh_eq_p(value,gh_symbol2scm("data-move")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	    DebugLevel0Fn("FIXME:\n");
+	} else {
+	   // FIXME: this leaves a half initialized unit
+	   errl("Unsupported tag",value);
+	}
+    }
+
+    //
+    //	Place on map
+    //
+    if( !unit->Removed && !unit->Destroyed ) {
+	unit->Removed=1;
+	PlaceUnit(unit,unit->X,unit->Y);
+    }
+
     DebugLevel0Fn("FIXME: not written\n");
 
     return SCM_UNSPECIFIED;
 }
 
+/**
+**	Make an unit.
+**
+**	@param type	Unit-type of the unit,
+**	@param player	Owning player number of the unit.
+**
+**	@return		Returns the slot number of the made unit.
+*/
+local SCM CclMakeUnit(SCM type,SCM player)
+{
+    UnitType* unittype;
+    Unit* unit;
+
+    unittype=CclGetUnitType(type);
+    unit=MakeUnit(unittype,&Players[gh_scm2int(player)]);
+
+    return gh_int2scm(unit->Slot);
+}
+
+/**
+**	Place an unit on map.
+**
+**	@param unit	Unit (slot number) to be placed.
+**	@param x	X map tile position.
+**	@param y	Y map tile position.
+**
+**	@return		Returns the slot number of the made placed.
+*/
+local SCM CclPlaceUnit(SCM unit,SCM x,SCM y)
+{
+    PlaceUnit(UnitSlots[gh_scm2int(unit)],gh_scm2int(x),gh_scm2int(y));
+    return unit;
+}
+
+
 /**
 **	Register CCL features for unit.
 */
@@ -88,6 +332,9 @@ global void UnitCclRegister(void)
     gh_new_procedure1_0("set-hitpoint-regeneration!",
 	    CclSetHitPointRegeneration);
     gh_new_procedureN("unit",CclUnit);
+
+    gh_new_procedure2_0("make-unit",CclMakeUnit);
+    gh_new_procedure3_0("place-unit",CclPlaceUnit);
 }
 
 #endif	// } USE_CCL