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 | |
42 | static char *yval(); |
42 | static char *yval(); |
43 | |
43 | |
44 | static int lex_error; |
44 | static int lex_error; |
45 | static char msgbuf[65536]; |
45 | static 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 | |
1409 | int load_object(FILE *fp, object *op, int bufstate, int map_flags) { |
1410 | int 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 | */ |
1451 | int set_variable(object *op,char *buf) { |
1452 | int 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 | |
2036 | void save_object(FILE *fp,object *op, int flag) { |
2038 | void 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 | |
2088 | void insert_event(object* op, int etype, char *ehook, char *eplug, char *eoptions) |
2091 | void insert_event(object* op, int etype, char *ehook, char *eplug, char *eoptions) |
2089 | { |
2092 | { |
2090 | event *evt; |
2093 | event *evt; |