summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/object/object.cpp67
-rw-r--r--src/object/object.h77
-rw-r--r--src/object/robotmain.cpp20
-rw-r--r--src/object/robotmain.h4
-rw-r--r--src/script/cmdtoken.cpp80
-rw-r--r--src/script/cmdtoken.h6
6 files changed, 221 insertions, 33 deletions
diff --git a/src/object/object.cpp b/src/object/object.cpp
index f1de424..2c32da0 100644
--- a/src/object/object.cpp
+++ b/src/object/object.cpp
@@ -7390,3 +7390,70 @@ void CObject::SetTraceWidth(float width)
mv->SetTraceWidth(width);
}
+DriveType CObject::GetDriveFromObject(ObjectType type)
+{
+ switch(type) {
+ case OBJECT_MOBILEwt:
+ case OBJECT_MOBILEwa:
+ case OBJECT_MOBILEwc:
+ case OBJECT_MOBILEwi:
+ case OBJECT_MOBILEws:
+ return DRIVE_WHEELED;
+
+ case OBJECT_MOBILEtt:
+ case OBJECT_MOBILEta:
+ case OBJECT_MOBILEtc:
+ case OBJECT_MOBILEti:
+ case OBJECT_MOBILEts:
+ return DRIVE_TRACKED;
+
+ case OBJECT_MOBILEft:
+ case OBJECT_MOBILEfa:
+ case OBJECT_MOBILEfc:
+ case OBJECT_MOBILEfi:
+ case OBJECT_MOBILEfs:
+ return DRIVE_WINGED;
+
+ case OBJECT_MOBILEit:
+ case OBJECT_MOBILEia:
+ case OBJECT_MOBILEic:
+ case OBJECT_MOBILEii:
+ case OBJECT_MOBILEis:
+ return DRIVE_LEGGED;
+
+ default:
+ return DRIVE_OTHER;
+ }
+}
+
+ToolType CObject::GetToolFromObject(ObjectType type)
+{
+ switch(type) {
+ case OBJECT_MOBILEwa:
+ case OBJECT_MOBILEta:
+ case OBJECT_MOBILEfa:
+ case OBJECT_MOBILEia:
+ return TOOL_GRABBER;
+
+ case OBJECT_MOBILEws:
+ case OBJECT_MOBILEts:
+ case OBJECT_MOBILEfs:
+ case OBJECT_MOBILEis:
+ return TOOL_SNIFFER;
+
+ case OBJECT_MOBILEwc:
+ case OBJECT_MOBILEtc:
+ case OBJECT_MOBILEfc:
+ case OBJECT_MOBILEic:
+ return TOOL_SHOOTER;
+
+ case OBJECT_MOBILEwi:
+ case OBJECT_MOBILEti:
+ case OBJECT_MOBILEfi:
+ case OBJECT_MOBILEii:
+ return TOOL_ORGASHOOTER;
+
+ default:
+ return TOOL_OTHER;
+ }
+}
diff --git a/src/object/object.h b/src/object/object.h
index b5c0385..64689eb 100644
--- a/src/object/object.h
+++ b/src/object/object.h
@@ -125,34 +125,34 @@ enum ObjectType
OBJECT_TREE7 = 97, //! < tree 7
OBJECT_TREE8 = 98, //! < tree 8
OBJECT_TREE9 = 99, //! < tree 9
- OBJECT_MOBILEwt = 100, //! < wheel-trainer
- OBJECT_MOBILEtt = 101, //! < track-trainer
- OBJECT_MOBILEft = 102, //! < fly-trainer
- OBJECT_MOBILEit = 103, //! < insect-trainer
- OBJECT_MOBILEwa = 110, //! < wheel-arm
- OBJECT_MOBILEta = 111, //! < track-arm
- OBJECT_MOBILEfa = 112, //! < fly-arm
- OBJECT_MOBILEia = 113, //! < insect-arm
- OBJECT_MOBILEwc = 120, //! < wheel-cannon
- OBJECT_MOBILEtc = 121, //! < track-cannon
- OBJECT_MOBILEfc = 122, //! < fly-cannon
- OBJECT_MOBILEic = 123, //! < insect-cannon
- OBJECT_MOBILEwi = 130, //! < wheel-insect-cannon
- OBJECT_MOBILEti = 131, //! < track-insect-cannon
- OBJECT_MOBILEfi = 132, //! < fly-insect-cannon
- OBJECT_MOBILEii = 133, //! < insect-insect-cannon
- OBJECT_MOBILEws = 140, //! < wheel-search
- OBJECT_MOBILEts = 141, //! < track-search
- OBJECT_MOBILEfs = 142, //! < fly-search
- OBJECT_MOBILEis = 143, //! < insect-search
- OBJECT_MOBILErt = 200, //! < roller-terraform
- OBJECT_MOBILErc = 201, //! < roller-canon
- OBJECT_MOBILErr = 202, //! < roller-recover
- OBJECT_MOBILErs = 203, //! < roller-shield
- OBJECT_MOBILEsa = 210, //! < submarine
- OBJECT_MOBILEtg = 211, //! < training target
- OBJECT_MOBILEdr = 212, //! < robot drawing
- OBJECT_CONTROLLER = 213, //! < mission controller
+ OBJECT_MOBILEwt = 100, //! < PracticeBot
+ OBJECT_MOBILEtt = 101, //! < track-trainer (unused)
+ OBJECT_MOBILEft = 102, //! < fly-trainer (unused)
+ OBJECT_MOBILEit = 103, //! < insect-trainer (unused)
+ OBJECT_MOBILEwa = 110, //! < WheeledGrabber
+ OBJECT_MOBILEta = 111, //! < TrackedGrabber
+ OBJECT_MOBILEfa = 112, //! < WingedGrabber
+ OBJECT_MOBILEia = 113, //! < LeggedGrabber
+ OBJECT_MOBILEwc = 120, //! < WheeledShooter
+ OBJECT_MOBILEtc = 121, //! < TrackedShooter
+ OBJECT_MOBILEfc = 122, //! < WingedShooter
+ OBJECT_MOBILEic = 123, //! < LeggedShooter
+ OBJECT_MOBILEwi = 130, //! < WheeledOrgaShooter
+ OBJECT_MOBILEti = 131, //! < TrackedOrgaShooter
+ OBJECT_MOBILEfi = 132, //! < WingedOrgaShooter
+ OBJECT_MOBILEii = 133, //! < LeggedOrgaShooter
+ OBJECT_MOBILEws = 140, //! < WheeledSniffer
+ OBJECT_MOBILEts = 141, //! < TrackedSniffer
+ OBJECT_MOBILEfs = 142, //! < WingedSniffer
+ OBJECT_MOBILEis = 143, //! < LeggedSniffer
+ OBJECT_MOBILErt = 200, //! < Thumper
+ OBJECT_MOBILErc = 201, //! < PhazerShooter
+ OBJECT_MOBILErr = 202, //! < Recycler
+ OBJECT_MOBILErs = 203, //! < Shielder
+ OBJECT_MOBILEsa = 210, //! < Subber
+ OBJECT_MOBILEtg = 211, //! < TargetBot
+ OBJECT_MOBILEdr = 212, //! < Scribbler
+ OBJECT_CONTROLLER = 213, //! < MissionController
OBJECT_WAYPOINT = 250, //! < waypoint
OBJECT_FLAGb = 260, //! < blue flag
OBJECT_FLAGr = 261, //! < red flag
@@ -311,6 +311,24 @@ enum ObjectMaterial
OM_MINERAL = 5, // stone
};
+enum DriveType
+{
+ DRIVE_OTHER = 0,
+ DRIVE_WHEELED,
+ DRIVE_TRACKED,
+ DRIVE_WINGED,
+ DRIVE_LEGGED,
+};
+
+enum ToolType
+{
+ TOOL_OTHER = 0,
+ TOOL_GRABBER,
+ TOOL_SNIFFER,
+ TOOL_SHOOTER,
+ TOOL_ORGASHOOTER,
+};
+
struct ObjectPart
{
char bUsed;
@@ -659,6 +677,9 @@ public:
void SetTraceWidth(float width);
std::string GetModelDirName();
+
+ static DriveType GetDriveFromObject(ObjectType type);
+ static ToolType GetToolFromObject(ObjectType type);
protected:
bool EventFrame(const Event &event);
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index af463c7..0852df0 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -4131,6 +4131,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_audioChange[i].max = OpInt(line, "max", 9999);
m_audioChange[i].powermin = OpFloat(line, "powermin", -1);
m_audioChange[i].powermax = OpFloat(line, "powermax", 100);
+ m_audioChange[i].tool = OpTool(line, "tool");
+ m_audioChange[i].drive = OpDrive(line, "drive");
OpString(line, "filename", m_audioChange[i].music);
m_audioChange[i].repeat = OpInt(line, "repeat", 1);
m_audioChange[i].changed = false;
@@ -4928,11 +4930,15 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
{
m_endTake[i].powermin = OpFloat(line, "powermin", -1);
m_endTake[i].powermax = OpFloat(line, "powermax", 100);
+ m_endTake[i].tool = OpTool(line, "tool");
+ m_endTake[i].drive = OpDrive(line, "drive");
}
else
{
m_endTake[i].powermin = -1;
m_endTake[i].powermax = 100;
+ m_endTake[i].tool = TOOL_OTHER;
+ m_endTake[i].drive = DRIVE_OTHER;
}
m_endTake[i].lost = OpInt(line, "lost", -1);
m_endTake[i].immediat = OpInt(line, "immediat", 0);
@@ -6594,8 +6600,13 @@ void CRobotMain::UpdateAudio(bool frame)
{
type = OBJECT_SCRAP1;
}
+
+ ToolType tool = CObject::GetToolFromObject(type);
+ DriveType drive = CObject::GetDriveFromObject(type);
+ if (m_audioChange[t].tool != TOOL_OTHER) if(tool != m_audioChange[t].tool) continue;
+ if (m_audioChange[t].drive != DRIVE_OTHER) if(drive != m_audioChange[t].drive) continue;
- if (type != m_audioChange[t].type) continue;
+ if (m_audioChange[t].tool == TOOL_OTHER && m_audioChange[t].drive == DRIVE_OTHER) if (type != m_audioChange[t].type) continue;
float energyLevel = -1;
CObject* power = obj->GetPower();
@@ -6699,7 +6710,12 @@ Error CRobotMain::CheckEndMission(bool frame)
type = OBJECT_SCRAP1;
}
- if (type != m_endTake[t].type) continue;
+ ToolType tool = CObject::GetToolFromObject(type);
+ DriveType drive = CObject::GetDriveFromObject(type);
+ if (m_endTake[t].tool != TOOL_OTHER) if(tool != m_endTake[t].tool) continue;
+ if (m_endTake[t].drive != DRIVE_OTHER) if(drive != m_endTake[t].drive) continue;
+
+ if (m_endTake[t].tool == TOOL_OTHER && m_endTake[t].drive == DRIVE_OTHER) if (type != m_endTake[t].type) continue;
float energyLevel = -1;
CObject* power = obj->GetPower();
diff --git a/src/object/robotmain.h b/src/object/robotmain.h
index c300b5a..8d58adb 100644
--- a/src/object/robotmain.h
+++ b/src/object/robotmain.h
@@ -103,6 +103,8 @@ struct EndTake
int lost; // lost if <=
float powermin; // wins if energy cell >=
float powermax; // wins if energy cell <=
+ ToolType tool;
+ DriveType drive;
bool immediat;
char message[100];
};
@@ -116,6 +118,8 @@ struct AudioChange
int max; // change if <
float powermin; // change if energy cell >=
float powermax; // change if energy cell <=
+ ToolType tool;
+ DriveType drive;
char music[100];
bool repeat;
bool changed;
diff --git a/src/script/cmdtoken.cpp b/src/script/cmdtoken.cpp
index 69df68b..4508459 100644
--- a/src/script/cmdtoken.cpp
+++ b/src/script/cmdtoken.cpp
@@ -535,11 +535,11 @@ const char* GetTypeObject(ObjectType type)
if ( type == OBJECT_INFO ) return "ExchangePost";
if ( type == OBJECT_ENERGY ) return "PowerPlant";
if ( type == OBJECT_LABO ) return "AutoLab";
-#if _GERMAN | _WG
+/* TODO: #if _GERMAN | _WG
if ( type == OBJECT_NUCLEAR ) return "FuelCellPlant";
-#else
+#else */
if ( type == OBJECT_NUCLEAR ) return "NuclearPlant";
-#endif
+/* #endif */
if ( type == OBJECT_PARA ) return "PowerCaptor";
if ( type == OBJECT_SAFE ) return "Vault";
if ( type == OBJECT_HUSTON ) return "Houston";
@@ -800,6 +800,62 @@ const char* GetCamera(Gfx::CameraType type)
return "BACK";
}
+// Returns the type of drive.
+
+DriveType GetDrive(char *line, int rank)
+{
+ char* p;
+
+ p = SearchArg(line, rank);
+ if ( *p == 0 ) return DRIVE_OTHER;
+
+ if ( Cmd(p, "Wheeled" ) ) return DRIVE_WHEELED;
+ if ( Cmd(p, "Tracked" ) ) return DRIVE_TRACKED;
+ if ( Cmd(p, "Winged" ) ) return DRIVE_WINGED;
+ if ( Cmd(p, "Legged" ) ) return DRIVE_LEGGED;
+
+ return DRIVE_OTHER;
+}
+
+// Returns the name of a drive.
+
+const char* GetDrive(DriveType type)
+{
+ if ( type == DRIVE_WHEELED ) return "Wheeled";
+ if ( type == DRIVE_TRACKED ) return "Tracked";
+ if ( type == DRIVE_WINGED ) return "Winged";
+ if ( type == DRIVE_LEGGED ) return "Legged";
+ return "Other";
+}
+
+// Returns the type of tool.
+
+ToolType GetTool(char *line, int rank)
+{
+ char* p;
+
+ p = SearchArg(line, rank);
+ if ( *p == 0 ) return TOOL_OTHER;
+
+ if ( Cmd(p, "Grabber" ) ) return TOOL_GRABBER;
+ if ( Cmd(p, "Sniffer" ) ) return TOOL_SNIFFER;
+ if ( Cmd(p, "Shooter" ) ) return TOOL_SHOOTER;
+ if ( Cmd(p, "OrgaShooter" ) ) return TOOL_ORGASHOOTER;
+
+ return TOOL_OTHER;
+}
+
+// Returns the name of a tool.
+
+const char* GetTool(ToolType type)
+{
+ if ( type == TOOL_GRABBER ) return "Grabber";
+ if ( type == TOOL_SNIFFER ) return "Sniffer";
+ if ( type == TOOL_SHOOTER ) return "Shooter";
+ if ( type == TOOL_ORGASHOOTER ) return "OrgaShooter";
+ return "Other";
+}
+
// Returns an integer.
int OpInt(char *line, const char *op, int def)
@@ -887,6 +943,24 @@ Gfx::CameraType OpCamera(char *line, const char *op)
return GetCamera(line, 0);
}
+// Returns the type of drive.
+
+DriveType OpDrive(char *line, const char *op)
+{
+ line = SearchOp(line, op);
+ if ( *line == 0 ) return DRIVE_OTHER;
+ return GetDrive(line, 0);
+}
+
+// Returns the type of tool.
+
+ToolType OpTool(char *line, const char *op)
+{
+ line = SearchOp(line, op);
+ if ( *line == 0 ) return TOOL_OTHER;
+ return GetTool(line, 0);
+}
+
// Returns the type of a building.
int OpBuild(char *line, const char *op)
diff --git a/src/script/cmdtoken.h b/src/script/cmdtoken.h
index fe831f1..24b592f 100644
--- a/src/script/cmdtoken.h
+++ b/src/script/cmdtoken.h
@@ -45,6 +45,10 @@ extern int GetResearch(char *line, int rank);
extern Gfx::PyroType GetPyro(char *line, int rank);
extern Gfx::CameraType GetCamera(char *line, int rank);
extern const char* GetCamera(Gfx::CameraType type);
+extern DriveType GetDrive(char *line, int rank);
+extern const char* GetDrive(DriveType type);
+extern ToolType GetTool(char *line, int rank);
+extern const char* GetTool(ToolType type);
extern int OpInt(char *line, const char *op, int def);
extern float OpFloat(char *line, const char *op, float def);
@@ -55,6 +59,8 @@ extern Gfx::EngineObjectType OpTypeTerrain(char *line, const char *op, Gfx::Engi
extern int OpResearch(char *line, const char *op);
extern Gfx::PyroType OpPyro(char *line, const char *op);
extern Gfx::CameraType OpCamera(char *line, const char *op);
+extern DriveType OpDrive(char *line, const char *op);
+extern ToolType OpTool(char *line, const char *op);
extern int OpBuild(char *line, const char *op);
extern Math::Vector OpPos(char *line, const char *op);
extern Math::Vector OpDir(char *line, const char *op);