ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/loader.l
(Generate patch)

Comparing deliantra/server/common/loader.l (file contents):
Revision 1.9 by root, Sat Aug 26 23:36:29 2006 UTC vs.
Revision 1.10 by root, Sun Aug 27 16:15:11 2006 UTC

1%{ 1%{
2/* 2/*
3 * static char *rcsid_object_c = 3 * static char *rcsid_object_c =
4 * "$Id: loader.l,v 1.9 2006/08/26 23:36:29 root Exp $"; 4 * "$Id: loader.l,v 1.10 2006/08/27 16:15:11 root Exp $";
5 */ 5 */
6 6
7/* 7/*
8 CrossFire, A Multiplayer game for X-windows 8 CrossFire, A Multiplayer game for X-windows
9 9
35#include <global.h> 35#include <global.h>
36#include <loader.h> 36#include <loader.h>
37#include <newserver.h> 37#include <newserver.h>
38#include <sproto.h> 38#include <sproto.h>
39 39
40#define YY_DECL int lex_load(object *op, int map_flags) 40#define YY_DECL int lex_load(object *op, object_thawer &thawer, int map_flags)
41 41
42static char *yval(); 42static char *yval();
43 43
44static int lex_error; 44static int lex_error;
45static char msgbuf[65536]; 45static char msgbuf[65536];
727 /* record the name of the broken object */ 727 /* record the name of the broken object */
728 tmp->name = add_string(yv); 728 tmp->name = add_string(yv);
729 } 729 }
730 strcpy(msgbuf, ""); 730 strcpy(msgbuf, "");
731 strcpy(lorebuf, ""); 731 strcpy(lorebuf, "");
732 lex_load(tmp, map_flags); 732 lex_load(tmp, thawer, map_flags);
733 if (tmp->arch) { 733 if (tmp->arch) {
734 insert_ob_in_ob(tmp,op); 734 insert_ob_in_ob(tmp,op);
735 } 735 }
736 else { 736 else {
737 LOG(llevDebug,"Discarding object without arch: %s\n", tmp->name?tmp->name:"(null)"); 737 LOG(llevDebug,"Discarding object without arch: %s\n", tmp->name?tmp->name:"(null)");
770 */ 770 */
771 ismore=1; 771 ismore=1;
772 } 772 }
773 773
774^end{WS}$ { check_loaded_object(op); 774^end{WS}$ { check_loaded_object(op);
775 thawer.get (op);
775 if (ismore) return LL_MORE; 776 if (ismore) return LL_MORE;
776 else return LL_NORMAL; 777 else return LL_NORMAL;
777 } 778 }
778^last_heal{S} op->last_heal = IVAL; 779^last_heal{S} op->last_heal = IVAL;
779^last_sp{S} op->last_sp = IVAL; 780^last_sp{S} op->last_sp = IVAL;
1404 * be reset. 1405 * be reset.
1405 * LO_NOREAD (3): Reset the buffers, but don't read from it. (op can be null) 1406 * LO_NOREAD (3): Reset the buffers, but don't read from it. (op can be null)
1406 * 1407 *
1407 */ 1408 */
1408 1409
1409int load_object(FILE *fp, object *op, int bufstate, int map_flags) { 1410int load_object(FILE *fp, object_thawer &thawer, object *op, int bufstate, int map_flags) {
1410 int retval; 1411 int retval;
1411 char inbuf[MAX_BUF]; 1412 char inbuf[MAX_BUF];
1412 1413
1413 strcpy(msgbuf, ""); 1414 strcpy(msgbuf, "");
1414 strcpy(lorebuf, ""); 1415 strcpy(lorebuf, "");
1420 } 1421 }
1421 if (bufstate==LO_LINEMODE) { 1422 if (bufstate==LO_LINEMODE) {
1422 YY_BUFFER_STATE yybufstate; 1423 YY_BUFFER_STATE yybufstate;
1423 while (fgets(inbuf, MAX_BUF-3, fp)) { 1424 while (fgets(inbuf, MAX_BUF-3, fp)) {
1424 yybufstate=yy_scan_string(inbuf); 1425 yybufstate=yy_scan_string(inbuf);
1425 retval=lex_load(op, map_flags); 1426 retval=lex_load(op, thawer, map_flags);
1426 yy_delete_buffer(yybufstate); 1427 yy_delete_buffer(yybufstate);
1427 if (retval==LL_NORMAL) return retval; 1428 if (retval==LL_NORMAL) return retval;
1428 } 1429 }
1429 LOG(llevDebug,"Got eof while scanning strings\n"); 1430 LOG(llevDebug,"Got eof while scanning strings\n");
1430 return LL_EOF; 1431 return LL_EOF;
1431 } 1432 }
1432 1433
1433 retval=lex_load(op, map_flags); 1434 retval=lex_load(op, thawer, map_flags);
1434 if (op->current_weapon_script != NULL) 1435 if (op->current_weapon_script != NULL)
1435 { 1436 {
1436 op->current_weapon = find_best_weapon_used_match(op, op->current_weapon_script); 1437 op->current_weapon = find_best_weapon_used_match(op, op->current_weapon_script);
1437 LOG(llevDebug, "CurrentWeapon Loaded !\n"); 1438 LOG(llevDebug, "CurrentWeapon Loaded !\n");
1438 }; 1439 };
1449 * override values and in c_wiz to mutate values. 1450 * override values and in c_wiz to mutate values.
1450 */ 1451 */
1451int set_variable(object *op,char *buf) { 1452int set_variable(object *op,char *buf) {
1452 YY_BUFFER_STATE yybufstate,yycurbuf=YY_CURRENT_BUFFER; 1453 YY_BUFFER_STATE yybufstate,yycurbuf=YY_CURRENT_BUFFER;
1453 int retval; 1454 int retval;
1455 object_thawer thawer;
1454 1456
1455 strcpy(msgbuf, ""); 1457 strcpy(msgbuf, "");
1456 strcpy(lorebuf, ""); 1458 strcpy(lorebuf, "");
1457 yy_push_state(INITIAL); 1459 yy_push_state(INITIAL);
1458 yybufstate=yy_scan_string(buf); 1460 yybufstate=yy_scan_string(buf);
1459 retval=lex_load(op,0); 1461 retval=lex_load(op,thawer,0);
1460 yy_switch_to_buffer(yycurbuf); 1462 yy_switch_to_buffer(yycurbuf);
1461 yy_delete_buffer(yybufstate); 1463 yy_delete_buffer(yybufstate);
1462 yy_pop_state(); 1464 yy_pop_state();
1463 return retval; 1465 return retval;
1464} 1466}
2031 * the only place this is not set is when saving the player. 2033 * the only place this is not set is when saving the player.
2032 * If bit 1 of flag is set, don't remove the object after save. As of now, 2034 * If bit 1 of flag is set, don't remove the object after save. As of now,
2033 * all of the callers are setting this. 2035 * all of the callers are setting this.
2034 */ 2036 */
2035 2037
2036void save_object(FILE *fp,object *op, int flag) { 2038void save_object(FILE *fp,object_freezer &freezer,object *op, int flag) {
2037 archetype *at; 2039 archetype *at;
2038 char *cp; 2040 char *cp;
2039 object *tmp,*old; 2041 object *tmp,*old;
2040 2042
2041 /* Even if the object does have an owner, it would seem that we should 2043 /* Even if the object does have an owner, it would seem that we should
2059 2061
2060 old=NULL; 2062 old=NULL;
2061 2063
2062 if (flag & 2 ) 2064 if (flag & 2 )
2063 for(tmp=op->inv;tmp!=NULL;tmp=tmp->below) 2065 for(tmp=op->inv;tmp!=NULL;tmp=tmp->below)
2064 save_object(fp,tmp,flag); 2066 save_object(fp,freezer,tmp,flag);
2065 2067
2066 /* Slightly different logic because tmp/op will be removed by 2068 /* Slightly different logic because tmp/op will be removed by
2067 * the save_object we call. So we just keep looking at op->inv 2069 * the save_object we call. So we just keep looking at op->inv
2068 * until there is nothing left. In theory, the variable old 2070 * until there is nothing left. In theory, the variable old
2069 * should not be needed, as recursive loops shouldn't happen. 2071 * should not be needed, as recursive loops shouldn't happen.
2071 else while ((tmp=op->inv)!=NULL) { 2073 else while ((tmp=op->inv)!=NULL) {
2072 if(old==tmp) { 2074 if(old==tmp) {
2073 LOG(llevError," Recursive loop in inventory\n"); 2075 LOG(llevError," Recursive loop in inventory\n");
2074 break; 2076 break;
2075 } 2077 }
2076 save_object(fp,tmp,flag); 2078 save_object(fp,freezer,tmp,flag);
2077 old=tmp; 2079 old=tmp;
2078 } 2080 }
2079 2081
2080 if (!(flag&2)) { 2082 if (!(flag&2)) {
2081 remove_ob(op); 2083 remove_ob(op);
2082 free_object (op); 2084 free_object (op);
2083 } 2085 }
2084 2086
2085 fprintf(fp,"end\n"); 2087 fprintf(fp,"end\n");
2088 freezer.put (op);
2086} 2089}
2087 2090
2088void insert_event(object* op, int etype, char *ehook, char *eplug, char *eoptions) 2091void insert_event(object* op, int etype, char *ehook, char *eplug, char *eoptions)
2089{ 2092{
2090 event *evt; 2093 event *evt;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines