From 01c361ddda318fe3f56f030dd8c0cfb4b05b8c25 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Wed, 22 Jun 2005 09:09:46 +0000 Subject: [PATCH] add level component saving functions which use PhysicsFS --- ChangeLog | 6 ++++ main/cntrlcen.c | 17 ++++++++-- main/cntrlcen.h | 4 ++- main/fuelcen.c | 15 +++++++-- main/fuelcen.h | 4 ++- main/game.c | 13 ++++++-- main/game.h | 4 ++- main/segment.c | 32 +++++++++++++++++-- main/segment.h | 6 +++- main/switch.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++-- main/switch.h | 4 ++- main/wall.c | 39 +++++++++++++++++++++-- main/wall.h | 4 ++- 13 files changed, 213 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8fcde9ad..ed44c648 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,12 @@ * main/editor/kgame.c: load .rl2 files instead of .lvl files (some editor info could be stored in .rdl / .rl2 files) + * include/nocfile.h, main/cntrlcen.c, main/cntrlcen.h, + main/fuelcen.c, main/fuelcen.h, main/game.c, main/game.h, + main/segment.c, main/segment.h, main/switch.c, main/switch.h, + main/wall.c, main/wall.h: add level component saving functions, + which use PhysicsFS and are endian friendly + 2005-06-14 Chris Taylor * main/mission.c: make sure there is a path to free for D2 Demo/OEM diff --git a/main/cntrlcen.c b/main/cntrlcen.c index e36bdc7d..2505c5e4 100644 --- a/main/cntrlcen.c +++ b/main/cntrlcen.c @@ -1,4 +1,4 @@ -/* $Id: cntrlcen.c,v 1.18 2004-12-01 12:48:13 btb Exp $ */ +/* $Id: cntrlcen.c,v 1.19 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -23,7 +23,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: cntrlcen.c,v 1.18 2004-12-01 12:48:13 btb Exp $"; +static char rcsid[] = "$Id: cntrlcen.c,v 1.19 2005-06-22 09:08:21 chris Exp $"; #endif #ifdef WINDOWS @@ -554,3 +554,16 @@ extern int control_center_triggers_read_n(control_center_triggers *cct, int n, C return i; } #endif + +int control_center_triggers_write(control_center_triggers *cct, PHYSFS_file *fp) +{ + int j; + + PHYSFS_writeSLE16(fp, cct->num_links); + for (j = 0; j < MAX_CONTROLCEN_LINKS; j++) + PHYSFS_writeSLE16(fp, cct->seg[j]); + for (j = 0; j < MAX_CONTROLCEN_LINKS; j++) + PHYSFS_writeSLE16(fp, cct->side[j]); + + return 1; +} diff --git a/main/cntrlcen.h b/main/cntrlcen.h index 60ae16dc..7783c8cb 100644 --- a/main/cntrlcen.h +++ b/main/cntrlcen.h @@ -1,4 +1,4 @@ -/* $Id: cntrlcen.h,v 1.7 2004-08-28 23:17:45 schaffner Exp $ */ +/* $Id: cntrlcen.h,v 1.8 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -96,4 +96,6 @@ extern int reactor_read_n(reactor *r, int n, CFILE *fp); extern int control_center_triggers_read_n(control_center_triggers *cct, int n, CFILE *fp); #endif +extern int control_center_triggers_write(control_center_triggers *cct, PHYSFS_file *fp); + #endif /* _CNTRLCEN_H */ diff --git a/main/fuelcen.c b/main/fuelcen.c index 018c303f..01df3a3f 100644 --- a/main/fuelcen.c +++ b/main/fuelcen.c @@ -1,4 +1,4 @@ -/* $Id: fuelcen.c,v 1.10 2004-08-28 23:17:45 schaffner Exp $ */ +/* $Id: fuelcen.c,v 1.11 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -23,7 +23,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: fuelcen.c,v 1.10 2004-08-28 23:17:45 schaffner Exp $"; +static char rcsid[] = "$Id: fuelcen.c,v 1.11 2005-06-22 09:08:21 chris Exp $"; #endif #include @@ -1215,3 +1215,14 @@ void matcen_info_read(matcen_info *mi, CFILE *fp) mi->fuelcen_num = cfile_read_short(fp); } #endif + +void matcen_info_write(matcen_info *mi, short version, PHYSFS_file *fp) +{ + PHYSFS_writeSLE32(fp, mi->robot_flags[0]); + if (version >= 27) + PHYSFS_writeSLE32(fp, mi->robot_flags[1]); + PHYSFSX_writeFix(fp, mi->hit_points); + PHYSFSX_writeFix(fp, mi->interval); + PHYSFS_writeSLE16(fp, mi->segnum); + PHYSFS_writeSLE16(fp, mi->fuelcen_num); +} diff --git a/main/fuelcen.h b/main/fuelcen.h index 4c82e4bf..c1c85874 100644 --- a/main/fuelcen.h +++ b/main/fuelcen.h @@ -1,4 +1,4 @@ -/* $Id: fuelcen.h,v 1.8 2004-08-28 23:17:45 schaffner Exp $ */ +/* $Id: fuelcen.h,v 1.9 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -165,4 +165,6 @@ void old_matcen_info_read(old_matcen_info *mi, CFILE *fp); void matcen_info_read(matcen_info *ps, CFILE *fp); #endif +void matcen_info_write(matcen_info *mi, short version, PHYSFS_file *fp); + #endif diff --git a/main/game.c b/main/game.c index 1b74bd57..d293fcea 100644 --- a/main/game.c +++ b/main/game.c @@ -1,4 +1,4 @@ -/* $Id: game.c,v 1.36 2005-04-01 03:21:32 chris Exp $ */ +/* $Id: game.c,v 1.37 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -23,7 +23,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -char game_rcsid[] = "$Id: game.c,v 1.36 2005-04-01 03:21:32 chris Exp $"; +char game_rcsid[] = "$Id: game.c,v 1.37 2005-06-22 09:08:21 chris Exp $"; #endif #ifdef WINDOWS @@ -3390,3 +3390,12 @@ void flickering_light_read(flickering_light *fl, CFILE *fp) fl->timer = cfile_read_fix(fp); fl->delay = cfile_read_fix(fp); } + +void flickering_light_write(flickering_light *fl, PHYSFS_file *fp) +{ + PHYSFS_writeSLE16(fp, fl->segnum); + PHYSFS_writeSLE16(fp, fl->sidenum); + PHYSFS_writeULE32(fp, fl->mask); + PHYSFSX_writeFix(fp, fl->timer); + PHYSFSX_writeFix(fp, fl->delay); +} diff --git a/main/game.h b/main/game.h index 6b2e3975..14fa36f6 100644 --- a/main/game.h +++ b/main/game.h @@ -1,4 +1,4 @@ -/* $Id: game.h,v 1.10 2005-03-20 12:53:33 btb Exp $ */ +/* $Id: game.h,v 1.11 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -271,6 +271,8 @@ int gr_toggle_fullscreen_game(void); */ void flickering_light_read(flickering_light *fl, CFILE *fp); +void flickering_light_write(flickering_light *fl, PHYSFS_file *fp); + #define MAX_FPS 80 extern int maxfps; diff --git a/main/segment.c b/main/segment.c index bf388368..7dfd63eb 100644 --- a/main/segment.c +++ b/main/segment.c @@ -1,4 +1,4 @@ -/* $Id: segment.c,v 1.3 2003-10-10 09:36:35 btb Exp $ */ +/* $Id: segment.c,v 1.4 2005-06-22 09:08:21 chris Exp $ */ /* * @@ -15,7 +15,7 @@ #include "cfile.h" #ifdef RCS -static char rcsid[] = "$Id: segment.c,v 1.3 2003-10-10 09:36:35 btb Exp $"; +static char rcsid[] = "$Id: segment.c,v 1.4 2005-06-22 09:08:21 chris Exp $"; #endif #ifndef FAST_FILE_IO @@ -57,3 +57,31 @@ void dl_index_read(dl_index *di, CFILE *fp) di->index = cfile_read_short(fp); } #endif + +void segment2_write(segment2 *s2, PHYSFS_file *fp) +{ + PHYSFSX_writeU8(fp, s2->special); + PHYSFSX_writeU8(fp, s2->matcen_num); + PHYSFSX_writeU8(fp, s2->value); + PHYSFSX_writeU8(fp, s2->s2_flags); + PHYSFSX_writeFix(fp, s2->static_light); +} + +void delta_light_write(delta_light *dl, PHYSFS_file *fp) +{ + PHYSFS_writeSLE16(fp, dl->segnum); + PHYSFSX_writeU8(fp, dl->sidenum); + PHYSFSX_writeU8(fp, dl->dummy); + PHYSFSX_writeU8(fp, dl->vert_light[0]); + PHYSFSX_writeU8(fp, dl->vert_light[1]); + PHYSFSX_writeU8(fp, dl->vert_light[2]); + PHYSFSX_writeU8(fp, dl->vert_light[3]); +} + +void dl_index_write(dl_index *di, PHYSFS_file *fp) +{ + PHYSFS_writeSLE16(fp, di->segnum); + PHYSFSX_writeU8(fp, di->sidenum); + PHYSFSX_writeU8(fp, di->count); + PHYSFS_writeSLE16(fp, di->index); +} diff --git a/main/segment.h b/main/segment.h index 560847f4..ddd2b524 100644 --- a/main/segment.h +++ b/main/segment.h @@ -1,4 +1,4 @@ -/* $Id: segment.h,v 1.6 2004-12-24 05:17:09 btb Exp $ */ +/* $Id: segment.h,v 1.7 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -269,4 +269,8 @@ void delta_light_read(delta_light *dl, CFILE *fp); void dl_index_read(dl_index *di, CFILE *fp); #endif +void segment2_write(segment2 *s2, PHYSFS_file *fp); +void delta_light_write(delta_light *dl, PHYSFS_file *fp); +void dl_index_write(dl_index *di, PHYSFS_file *fp); + #endif diff --git a/main/switch.c b/main/switch.c index dd95e160..29d3d441 100644 --- a/main/switch.c +++ b/main/switch.c @@ -1,4 +1,4 @@ -/* $Id: switch.c,v 1.11 2004-08-28 23:17:45 schaffner Exp $ */ +/* $Id: switch.c,v 1.12 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -23,7 +23,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: switch.c,v 1.11 2004-08-28 23:17:45 schaffner Exp $"; +static char rcsid[] = "$Id: switch.c,v 1.12 2005-06-22 09:08:21 chris Exp $"; #endif #include @@ -725,3 +725,82 @@ extern void trigger_read(trigger *t, CFILE *fp) t->side[i] = cfile_read_short(fp); } #endif + +void trigger_write(trigger *t, short version, PHYSFS_file *fp) +{ + int i; + + if (version != 30) + PHYSFSX_writeU8(fp, t->type); + + if (version <= 29) + switch (t->type) + { + case TT_OPEN_DOOR: + PHYSFS_writeSLE16(fp, TRIGGER_CONTROL_DOORS); + break; + + case TT_EXIT: + PHYSFS_writeSLE16(fp, TRIGGER_EXIT); + break; + + case TT_MATCEN: + PHYSFS_writeSLE16(fp, TRIGGER_MATCEN); + break; + + case TT_ILLUSION_OFF: + PHYSFS_writeSLE16(fp, TRIGGER_ILLUSION_OFF); + break; + + case TT_SECRET_EXIT: + PHYSFS_writeSLE16(fp, TRIGGER_SECRET_EXIT); + break; + + case TT_ILLUSION_ON: + PHYSFS_writeSLE16(fp, TRIGGER_ILLUSION_ON); + break; + + case TT_UNLOCK_DOOR: + PHYSFS_writeSLE16(fp, TRIGGER_UNLOCK_DOORS); + break; + + case TT_OPEN_WALL: + PHYSFS_writeSLE16(fp, TRIGGER_OPEN_WALL); + break; + + case TT_CLOSE_WALL: + PHYSFS_writeSLE16(fp, TRIGGER_CLOSE_WALL); + break; + + case TT_ILLUSORY_WALL: + PHYSFS_writeSLE16(fp, TRIGGER_ILLUSORY_WALL); + break; + + default: + Int3(); + PHYSFS_writeSLE16(fp, 0); + break; + } + else + PHYSFSX_writeU8(fp, t->flags); + + if (version >= 30) + { + PHYSFSX_writeU8(fp, t->num_links); + PHYSFSX_writeU8(fp, t->pad); + } + + PHYSFSX_writeFix(fp, t->value); + PHYSFSX_writeFix(fp, t->time); + + if (version <= 29) + { + PHYSFSX_writeU8(fp, -1); //t->link_num + PHYSFS_writeSLE16(fp, t->num_links); + } + + for (i = 0; i < MAX_WALLS_PER_LINK; i++) + PHYSFS_writeSLE16(fp, t->seg[i]); + for (i = 0; i < MAX_WALLS_PER_LINK; i++) + PHYSFS_writeSLE16(fp, t->side[i]); +} diff --git a/main/switch.h b/main/switch.h index 70b16e3c..8c67f1af 100644 --- a/main/switch.h +++ b/main/switch.h @@ -1,4 +1,4 @@ -/* $Id: switch.h,v 1.5 2004-08-28 23:17:45 schaffner Exp $ */ +/* $Id: switch.h,v 1.6 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -135,4 +135,6 @@ extern void v30_trigger_read(v30_trigger *t, CFILE *fp); extern void trigger_read(trigger *t, CFILE *fp); #endif +extern void trigger_write(trigger *t, short version, PHYSFS_file *fp); + #endif diff --git a/main/wall.c b/main/wall.c index 61fd9c4a..74515e34 100644 --- a/main/wall.c +++ b/main/wall.c @@ -1,4 +1,4 @@ -/* $Id: wall.c,v 1.14 2005-01-24 21:41:35 schaffner Exp $ */ +/* $Id: wall.c,v 1.15 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -23,7 +23,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: wall.c,v 1.14 2005-01-24 21:41:35 schaffner Exp $"; +static char rcsid[] = "$Id: wall.c,v 1.15 2005-06-22 09:08:21 chris Exp $"; #endif #include @@ -1703,3 +1703,38 @@ extern void active_door_read(active_door *ad, CFILE *fp) ad->time = cfile_read_fix(fp); } #endif + +void wall_write(wall *w, short version, CFILE *fp) +{ + if (version >= 17) + { + PHYSFS_writeSLE32(fp, w->segnum); + PHYSFS_writeSLE32(fp, w->sidenum); + } + + if (version >= 20) + { + PHYSFSX_writeFix(fp, w->hps); + PHYSFS_writeSLE32(fp, w->linked_wall); + } + + PHYSFSX_writeU8(fp, w->type); + PHYSFSX_writeU8(fp, w->flags); + + if (version < 20) + PHYSFSX_writeFix(fp, w->hps); + else + PHYSFSX_writeU8(fp, w->state); + + PHYSFSX_writeU8(fp, w->trigger); + PHYSFSX_writeU8(fp, w->clip_num); + PHYSFSX_writeU8(fp, w->keys); + + if (version >= 20) + { + PHYSFSX_writeU8(fp, w->controlling_trigger); + PHYSFSX_writeU8(fp, w->cloak_value); + } + else if (version >= 17) + PHYSFS_writeSLE32(fp, w->linked_wall); +} diff --git a/main/wall.h b/main/wall.h index c36210d6..a85e6a49 100644 --- a/main/wall.h +++ b/main/wall.h @@ -1,4 +1,4 @@ -/* $Id: wall.h,v 1.9 2005-01-24 21:41:35 schaffner Exp $ */ +/* $Id: wall.h,v 1.10 2005-06-22 09:08:21 chris Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -302,4 +302,6 @@ extern void v19_door_read(v19_door *d, CFILE *fp); extern void active_door_read(active_door *ad, CFILE *fp); #endif +extern void wall_write(wall *w, short version, PHYSFS_file *fp); + #endif -- 2.39.2