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.8 by root, Sat Aug 26 08:44:04 2006 UTC vs.
Revision 1.11 by root, Sun Aug 27 17:59:25 2006 UTC

1%{ 1%{
2/* 2/*
3 * static char *rcsid_object_c = 3 * static char *rcsid_object_c =
4 * "$Id: loader.l,v 1.8 2006/08/26 08:44:04 root Exp $"; 4 * "$Id: loader.l,v 1.11 2006/08/27 17:59:25 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];
716 */ 716 */
717 if (op->arch) { 717 if (op->arch) {
718 object *tmp; 718 object *tmp;
719 char *yv=yval(); 719 char *yv=yval();
720 720
721 tmp=get_object();
722 tmp->arch = find_archetype(yv); 721 archetype *arch = find_archetype(yv);
723 if (tmp->arch!=NULL) 722 if (arch!=NULL)
724 copy_object(&tmp->arch->clone,tmp); 723 tmp = arch_to_object (arch);
725 else { 724 else {
725 tmp = get_object ();
726 if (tmp->name) free_string(tmp->name); 726 if (tmp->name) free_string(tmp->name);
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)");
741 /* This is the actual archetype definition then */ 741 /* This is the actual archetype definition then */
742 else { 742 else {
743 char *yv=yval(); 743 char *yv=yval();
744 744
745 op->arch=find_archetype(yv); 745 op->arch=find_archetype(yv);
746 if (op->arch!=NULL) copy_object(&op->arch->clone,op); 746 if (op->arch!=NULL) {
747 else if (!arch_init) { 747 copy_object(&op->arch->clone,op);
748 } else if (!arch_init) {
748 if (op->name) free_string(op->name); 749 if (op->name) free_string(op->name);
749 /* record the name of the broken object */ 750 /* record the name of the broken object */
750 op->name = add_string(yv); 751 op->name = add_string(yv);
751 } 752 }
752 } 753 }
768 */ 769 */
769 ismore=1; 770 ismore=1;
770 } 771 }
771 772
772^end{WS}$ { check_loaded_object(op); 773^end{WS}$ { check_loaded_object(op);
774
775 if (!arch_init)
776 {
777 thawer.get (op);
778 op->instantiate ();
779 }
780
773 if (ismore) return LL_MORE; 781 if (ismore) return LL_MORE;
774 else return LL_NORMAL; 782 else return LL_NORMAL;
775 } 783 }
776^last_heal{S} op->last_heal = IVAL; 784^last_heal{S} op->last_heal = IVAL;
777^last_sp{S} op->last_sp = IVAL; 785^last_sp{S} op->last_sp = IVAL;
1402 * be reset. 1410 * be reset.
1403 * LO_NOREAD (3): Reset the buffers, but don't read from it. (op can be null) 1411 * LO_NOREAD (3): Reset the buffers, but don't read from it. (op can be null)
1404 * 1412 *
1405 */ 1413 */
1406 1414
1407int load_object(FILE *fp, object *op, int bufstate, int map_flags) { 1415int load_object(FILE *fp, object_thawer &thawer, object *op, int bufstate, int map_flags) {
1408 int retval; 1416 int retval;
1409 char inbuf[MAX_BUF]; 1417 char inbuf[MAX_BUF];
1410 1418
1411 strcpy(msgbuf, ""); 1419 strcpy(msgbuf, "");
1412 strcpy(lorebuf, ""); 1420 strcpy(lorebuf, "");
1418 } 1426 }
1419 if (bufstate==LO_LINEMODE) { 1427 if (bufstate==LO_LINEMODE) {
1420 YY_BUFFER_STATE yybufstate; 1428 YY_BUFFER_STATE yybufstate;
1421 while (fgets(inbuf, MAX_BUF-3, fp)) { 1429 while (fgets(inbuf, MAX_BUF-3, fp)) {
1422 yybufstate=yy_scan_string(inbuf); 1430 yybufstate=yy_scan_string(inbuf);
1423 retval=lex_load(op, map_flags); 1431 retval=lex_load(op, thawer, map_flags);
1424 yy_delete_buffer(yybufstate); 1432 yy_delete_buffer(yybufstate);
1425 if (retval==LL_NORMAL) return retval; 1433 if (retval==LL_NORMAL) return retval;
1426 } 1434 }
1427 LOG(llevDebug,"Got eof while scanning strings\n"); 1435 LOG(llevDebug,"Got eof while scanning strings\n");
1428 return LL_EOF; 1436 return LL_EOF;
1429 } 1437 }
1430 1438
1431 retval=lex_load(op, map_flags); 1439 retval=lex_load(op, thawer, map_flags);
1432 if (op->current_weapon_script != NULL) 1440 if (op->current_weapon_script != NULL)
1433 { 1441 {
1434 op->current_weapon = find_best_weapon_used_match(op, op->current_weapon_script); 1442 op->current_weapon = find_best_weapon_used_match(op, op->current_weapon_script);
1435 LOG(llevDebug, "CurrentWeapon Loaded !\n"); 1443 LOG(llevDebug, "CurrentWeapon Loaded !\n");
1436 }; 1444 };
1447 * override values and in c_wiz to mutate values. 1455 * override values and in c_wiz to mutate values.
1448 */ 1456 */
1449int set_variable(object *op,char *buf) { 1457int set_variable(object *op,char *buf) {
1450 YY_BUFFER_STATE yybufstate,yycurbuf=YY_CURRENT_BUFFER; 1458 YY_BUFFER_STATE yybufstate,yycurbuf=YY_CURRENT_BUFFER;
1451 int retval; 1459 int retval;
1460 object_thawer thawer;
1452 1461
1453 strcpy(msgbuf, ""); 1462 strcpy(msgbuf, "");
1454 strcpy(lorebuf, ""); 1463 strcpy(lorebuf, "");
1455 yy_push_state(INITIAL); 1464 yy_push_state(INITIAL);
1456 yybufstate=yy_scan_string(buf); 1465 yybufstate=yy_scan_string(buf);
1457 retval=lex_load(op,0); 1466 retval=lex_load(op,thawer,0);
1458 yy_switch_to_buffer(yycurbuf); 1467 yy_switch_to_buffer(yycurbuf);
1459 yy_delete_buffer(yybufstate); 1468 yy_delete_buffer(yybufstate);
1460 yy_pop_state(); 1469 yy_pop_state();
1461 return retval; 1470 return retval;
1462} 1471}
2029 * the only place this is not set is when saving the player. 2038 * the only place this is not set is when saving the player.
2030 * If bit 1 of flag is set, don't remove the object after save. As of now, 2039 * If bit 1 of flag is set, don't remove the object after save. As of now,
2031 * all of the callers are setting this. 2040 * all of the callers are setting this.
2032 */ 2041 */
2033 2042
2034void save_object(FILE *fp,object *op, int flag) { 2043void save_object(FILE *fp,object_freezer &freezer,object *op, int flag) {
2035 archetype *at; 2044 archetype *at;
2036 char *cp; 2045 char *cp;
2037 object *tmp,*old; 2046 object *tmp,*old;
2038 2047
2039 /* Even if the object does have an owner, it would seem that we should 2048 /* Even if the object does have an owner, it would seem that we should
2057 2066
2058 old=NULL; 2067 old=NULL;
2059 2068
2060 if (flag & 2 ) 2069 if (flag & 2 )
2061 for(tmp=op->inv;tmp!=NULL;tmp=tmp->below) 2070 for(tmp=op->inv;tmp!=NULL;tmp=tmp->below)
2062 save_object(fp,tmp,flag); 2071 save_object(fp,freezer,tmp,flag);
2063 2072
2064 /* Slightly different logic because tmp/op will be removed by 2073 /* Slightly different logic because tmp/op will be removed by
2065 * the save_object we call. So we just keep looking at op->inv 2074 * the save_object we call. So we just keep looking at op->inv
2066 * until there is nothing left. In theory, the variable old 2075 * until there is nothing left. In theory, the variable old
2067 * should not be needed, as recursive loops shouldn't happen. 2076 * should not be needed, as recursive loops shouldn't happen.
2069 else while ((tmp=op->inv)!=NULL) { 2078 else while ((tmp=op->inv)!=NULL) {
2070 if(old==tmp) { 2079 if(old==tmp) {
2071 LOG(llevError," Recursive loop in inventory\n"); 2080 LOG(llevError," Recursive loop in inventory\n");
2072 break; 2081 break;
2073 } 2082 }
2074 save_object(fp,tmp,flag); 2083 save_object(fp,freezer,tmp,flag);
2075 old=tmp; 2084 old=tmp;
2076 } 2085 }
2077 2086
2078 if (!(flag&2)) { 2087 if (!(flag&2)) {
2079 remove_ob(op); 2088 remove_ob(op);
2080 free_object (op); 2089 free_object (op);
2081 } 2090 }
2082 2091
2083 fprintf(fp,"end\n"); 2092 fprintf(fp,"end\n");
2093 freezer.put (op);
2084} 2094}
2085 2095
2086void insert_event(object* op, int etype, char *ehook, char *eplug, char *eoptions) 2096void insert_event(object* op, int etype, char *ehook, char *eplug, char *eoptions)
2087{ 2097{
2088 event *evt; 2098 event *evt;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines