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

Comparing deliantra/server/common/loader.C (file contents):
Revision 1.14 by root, Tue Sep 12 19:20:06 2006 UTC vs.
Revision 1.15 by root, Wed Sep 13 02:05:19 2006 UTC

500 { 500 {
501 keyword kw = thawer.get_kv (); 501 keyword kw = thawer.get_kv ();
502 502
503 switch (kw) 503 switch (kw)
504 { 504 {
505 case KW_Object: // uppercase alias 505 case KW_Object: // uppercase alias
506 case KW_object: 506 case KW_object:
507 thawer.get (op->name); 507 thawer.get (op->name);
508 508
509 if (op->arch != NULL) 509 if (op->arch != NULL)
510 op->arch->name = op->name; 510 op->arch->name = op->name;
511 511
512 break; 512 break;
513 513
514 case KW_oid: 514 case KW_uuid:
515 thawer.get (op, thawer.get_sint32 ()); 515 if (const char *s = thawer.get_str ())
516 break;
517
518 case KW_name:
519 thawer.get (op->name);
520 break;
521 case KW_name_pl:
522 thawer.get (op->name_pl);
523 break;
524 case KW_title:
525 thawer.get (op->title);
526 break;
527 case KW_custom_name:
528 thawer.get (op->custom_name);
529 break;
530 case KW_attach:
531 thawer.get_ornull (op->attach);
532 break;
533 case KW_skill:
534 thawer.get_ornull (op->skill);
535 break;
536 case KW_race:
537 thawer.get_ornull (op->race);
538 break;
539 case KW_slaying:
540 thawer.get_ornull (op->slaying);
541 break;
542
543 case KW_arch:
544 { 516 {
545 const char *str = thawer.get_str (); 517 unsigned int version;
518 unsigned long long seq;
546 519
547 if (op->arch) 520 if (2 == sscanf (s, "<%d.%llx>", &version, &seq) && version == 1)
548 { 521 {
549 /* If op->arch has been set, then this new object 522 op->uuid.seq = seq;
550 * must be part of the inventory. So process
551 * appropriately.
552 */
553 archetype *arch = find_archetype (str);
554
555 object *tmp;
556
557 if (arch != NULL)
558 tmp = arch_to_object (arch);
559 else 523 break;
560 {
561 tmp = get_object ();
562 /* record the name of the broken object */
563 tmp->name = str;
564 }
565
566 parse_object (tmp, thawer, map_flags);
567
568 if (tmp->arch)
569 {
570 // was: insert_ob_in_ob (tmp, op);
571 // but manually adding it can improve map loading times a lot
572 // also, appending instead of prepending keeps the
573 // save ordering the same between repeated load/saves.
574 CLEAR_FLAG (tmp, FLAG_OBJ_ORIGINAL);
575 CLEAR_FLAG (tmp, FLAG_REMOVED);
576
577 if (!op_inv)
578 {
579 op->inv = tmp;
580 tmp->above = 0;
581 }
582 else
583 {
584 while (op_inv->below)
585 op_inv = op_inv->below;
586
587 op_inv->below = tmp;
588 tmp->above = op_inv;
589 }
590
591 tmp->below = 0;
592 tmp->env = op;
593 op_inv = tmp;
594 }
595 else
596 {
597 LOG (llevDebug, "Discarding object without arch: %s\n", tmp->name ? (const char *) tmp->name : "(null)");
598 free_object (tmp);
599 }
600 }
601 else
602 {
603 /* This is the actual archetype definition then */
604 op->arch = find_archetype (str);
605
606 if (op->arch != NULL)
607 copy_object (&op->arch->clone, op);
608 else if (!arch_init)
609 /* record the name of the broken object */
610 op->name = str;
611 } 524 }
612 } 525 }
526
527 op->uuid = gen_uuid ();
613 break; 528 break;
614 529
615 case KW_other_arch: 530 case KW_oid:
616 op->other_arch = find_archetype (thawer.get_str ()); 531 thawer.get (op, thawer.get_sint32 ());
617 break; 532 break;
618 533
619 case KW_animation: 534 case KW_name:
535 thawer.get (op->name);
536 break;
537 case KW_name_pl:
538 thawer.get (op->name_pl);
539 break;
540 case KW_title:
541 thawer.get (op->title);
542 break;
543 case KW_custom_name:
544 thawer.get (op->custom_name);
545 break;
546 case KW_attach:
547 thawer.get_ornull (op->attach);
548 break;
549 case KW_skill:
550 thawer.get_ornull (op->skill);
551 break;
552 case KW_race:
553 thawer.get_ornull (op->race);
554 break;
555 case KW_slaying:
556 thawer.get_ornull (op->slaying);
557 break;
558
559 case KW_arch:
620 { 560 {
621 const char *str = thawer.get_str (); 561 const char *str = thawer.get_str ();
622 562
623 if (!str) 563 if (op->arch)
624 {
625 op->animation_id = 0;
626 CLEAR_FLAG (op, FLAG_ANIMATE);
627 }
628 else
629 {
630 op->animation_id = find_animation (str);
631 SET_FLAG (op, FLAG_ANIMATE);
632 }
633 }
634
635 break;
636
637 case KW_last_heal:
638 thawer.get (op->last_heal);
639 break;
640 case KW_last_sp:
641 thawer.get (op->last_sp);
642 break;
643 case KW_last_grace:
644 thawer.get (op->last_grace);
645 break;
646 case KW_last_eat:
647 thawer.get (op->last_eat);
648 break;
649 case KW_speed_left:
650 thawer.get (op->speed_left);
651 break;
652
653 case KW_speed:
654 thawer.get (op->speed);
655
656 //TODO: maybe do in check_object
657 if (!(map_flags & MAP_STYLE))
658 { 564 {
659 if (op->speed < 0) 565 /* If op->arch has been set, then this new object
660 op->speed_left = op->speed_left - RANDOM () % 100 / 100.0; 566 * must be part of the inventory. So process
661 567 * appropriately.
662 update_ob_speed (op);
663 } 568 */
569 archetype *arch = find_archetype (str);
664 570
665 break; 571 object *tmp;
666 572
667 case KW_slow_move: 573 if (arch != NULL)
668 op->move_slow |= MOVE_WALK; 574 tmp = arch_to_object (arch);
669 thawer.get (op->move_slow_penalty);
670 break;
671
672 case KW_face:
673 op->face = &new_faces[FindFace (thawer.get_str (), 0)];
674 break;
675
676 case KW_x:
677 thawer.get (op->x);
678 break;
679 case KW_y:
680 thawer.get (op->y);
681 break;
682 case KW_Str: // uppercase alias
683 case KW_str:
684 thawer.get (op->stats.Str);
685 break;
686 case KW_Dex: // uppercase alias
687 case KW_dex:
688 thawer.get (op->stats.Dex);
689 break;
690 case KW_Con: // uppercase alias
691 case KW_con:
692 thawer.get (op->stats.Con);
693 break;
694 case KW_Wis: // uppercase alias
695 case KW_wis:
696 thawer.get (op->stats.Wis);
697 break;
698 case KW_Cha: // uppercase alias
699 case KW_cha:
700 thawer.get (op->stats.Cha);
701 break;
702 case KW_Int: // uppercase alias
703 case KW_int:
704 thawer.get (op->stats.Int);
705 break;
706 case KW_Pow: // uppercase alias
707 case KW_pow:
708 thawer.get (op->stats.Pow);
709 break;
710 case KW_hp:
711 thawer.get (op->stats.hp);
712 break;
713 case KW_maxhp:
714 thawer.get (op->stats.maxhp);
715 break;
716 case KW_sp:
717 thawer.get (op->stats.sp);
718 break;
719 case KW_maxsp:
720 thawer.get (op->stats.maxsp);
721 break;
722 case KW_grace:
723 thawer.get (op->stats.grace);
724 break;
725 case KW_maxgrace:
726 thawer.get (op->stats.maxgrace);
727 break;
728
729 case KW_exp:
730 thawer.get (op->stats.exp);
731 break;
732 case KW_perm_exp:
733 thawer.get (op->perm_exp);
734 break;
735 case KW_food:
736 thawer.get (op->stats.food);
737 break;
738 case KW_dam:
739 thawer.get (op->stats.dam);
740 break;
741 case KW_wc:
742 thawer.get (op->stats.wc);
743 break;
744 case KW_ac:
745 thawer.get (op->stats.ac);
746 break;
747 case KW_nrof:
748 thawer.get (op->nrof);
749 break;
750 case KW_level:
751 thawer.get (op->level);
752 break;
753 case KW_direction:
754 thawer.get (op->direction);
755 break;
756 case KW_type:
757 thawer.get (op->type);
758 break;
759 case KW_subtype:
760 thawer.get (op->subtype);
761 break;
762 case KW_value:
763 thawer.get (op->value);
764 break;
765 case KW_weight:
766 thawer.get (op->weight);
767 break;
768 case KW_carrying:
769 thawer.get (op->carrying);
770 break;
771 case KW_attacktype:
772 thawer.get (op->attacktype);
773 break;
774 case KW_path_attuned:
775 thawer.get (op->path_attuned);
776 break;
777 case KW_path_repelled:
778 thawer.get (op->path_repelled);
779 break;
780 case KW_path_denied:
781 thawer.get (op->path_denied);
782 break;
783 case KW_invisible:
784 thawer.get (op->invisible);
785 break;
786 case KW_magic:
787 thawer.get (op->magic);
788 break;
789 case KW_state:
790 thawer.get (op->state);
791 break;
792 case KW_move_slow_penalty:
793 thawer.get (op->move_slow_penalty);
794 break;
795 case KW_material:
796 thawer.get (op->material);
797 break;
798 case KW_materialname:
799 thawer.get (op->materialname);
800 break;
801
802 /* These are the new values */
803 case KW_move_block:
804 set_move (op->move_block, thawer.get_str ());
805 break;
806 case KW_move_allow:
807 set_move (op->move_allow, thawer.get_str ());
808 break;
809 case KW_move_type:
810 set_move (op->move_type, thawer.get_str ());
811 break;
812 case KW_move_on:
813 set_move (op->move_on, thawer.get_str ());
814 break;
815 case KW_move_off:
816 set_move (op->move_off, thawer.get_str ());
817 break;
818 case KW_move_slow:
819 set_move (op->move_slow, thawer.get_str ());
820 break;
821
822 /* These are all legacy - any new objects should use the move_ .. values */
823 case KW_no_pass:
824 {
825 if (thawer.get_sint32 ())
826 op->move_block = MOVE_ALL;
827 else 575 else
828 op->move_block = 0;
829 }
830
831 break;
832
833 /* These are all legacy - any new objects should use the move_ .. values */
834 case KW_walk_on:
835 { 576 {
836 if (thawer.get_sint32 ()) 577 tmp = get_object ();
837 op->move_on |= MOVE_WALK; 578 /* record the name of the broken object */
579 tmp->name = str;
580 }
581
582 parse_object (tmp, thawer, map_flags);
583
584 if (tmp->arch)
585 {
586 // was: insert_ob_in_ob (tmp, op);
587 // but manually adding it can improve map loading times a lot
588 // also, appending instead of prepending keeps the
589 // save ordering the same between repeated load/saves.
590 CLEAR_FLAG (tmp, FLAG_OBJ_ORIGINAL);
591 CLEAR_FLAG (tmp, FLAG_REMOVED);
592
593 if (!op_inv)
594 {
595 op->inv = tmp;
596 tmp->above = 0;
597 }
598 else
599 {
600 while (op_inv->below)
601 op_inv = op_inv->below;
602
603 op_inv->below = tmp;
604 tmp->above = op_inv;
605 }
606
607 tmp->below = 0;
608 tmp->env = op;
609 op_inv = tmp;
610 }
838 else 611 else
839 op->move_on &= ~MOVE_WALK;
840 }
841
842 break;
843
844 /* These are all legacy - any new objects should use the move_ .. values */
845 case KW_walk_off:
846 {
847 if (thawer.get_sint32 ())
848 op->move_off |= MOVE_WALK;
849 else
850 op->move_off &= ~MOVE_WALK;
851 }
852 break;
853
854 /* These are all legacy - any new objects should use the move_ .. values */
855 case KW_fly_on:
856 {
857 if (thawer.get_sint32 ())
858 op->move_on |= MOVE_FLY_LOW;
859 else
860 op->move_on &= ~MOVE_FLY_LOW;
861 }
862 break;
863
864 /* These are all legacy - any new objects should use the move_ .. values */
865 case KW_fly_off:
866 {
867 if (thawer.get_sint32 ())
868 op->move_off |= MOVE_FLY_LOW;
869 else
870 op->move_off &= ~MOVE_FLY_LOW;
871 }
872 break;
873
874 //TODO: remove these after convertign archetypes
875 case KW_can_use_wand:
876 GET_FLAG (op, FLAG_USE_RANGE);
877 break;
878
879 /* These are all legacy - any new objects should use the move_ .. values */
880 case KW_flying:
881 {
882 if (thawer.get_sint32 ())
883 op->move_type |= MOVE_FLY_LOW;
884 else
885 op->move_type &= ~MOVE_FLY_LOW;
886 }
887 break;
888
889
890 case KW_identified:
891 GET_FLAG (op, FLAG_IDENTIFIED);
892 //TODO: move to check_object or so
893 if (QUERY_FLAG (op, FLAG_IDENTIFIED))
894 CLEAR_FLAG (op, FLAG_KNOWN_MAGICAL);
895
896 break;
897
898 case KW_wiz:
899 GET_FLAG (op, FLAG_WIZ);
900 //TODO: move to check_object
901 if (QUERY_FLAG (op, FLAG_WIZ))
902 { 612 {
903 SET_FLAG (op, FLAG_WAS_WIZ); 613 LOG (llevDebug, "Discarding object without arch: %s\n", tmp->name ? (const char *) tmp->name : "(null)");
904 SET_FLAG (op, FLAG_WIZPASS); 614 free_object (tmp);
905 SET_FLAG (op, FLAG_WIZCAST); 615 }
906 } 616 }
907 else 617 else
908 { 618 {
909 CLEAR_FLAG (op, FLAG_WIZPASS); 619 /* This is the actual archetype definition then */
910 CLEAR_FLAG (op, FLAG_WIZCAST); 620 op->arch = find_archetype (str);
621
622 if (op->arch != NULL)
623 copy_object (&op->arch->clone, op);
624 else if (!arch_init)
625 /* record the name of the broken object */
626 op->name = str;
911 } 627 }
628 }
912 break; 629 break;
913 630
914 case KW_friendly: 631 case KW_other_arch:
915 GET_FLAG (op, FLAG_FRIENDLY); 632 op->other_arch = find_archetype (thawer.get_str ());
916 //TODO: move to check_object or so
917 if (op->type != PLAYER && QUERY_FLAG (op, FLAG_FRIENDLY))
918 add_friendly_object (op);
919 break; 633 break;
920 634
921 case KW_monster: 635 case KW_animation:
636 {
637 const char *str = thawer.get_str ();
638
639 if (!str)
640 {
641 op->animation_id = 0;
642 CLEAR_FLAG (op, FLAG_ANIMATE);
643 }
644 else
645 {
646 op->animation_id = find_animation (str);
922 GET_FLAG (op, FLAG_MONSTER); 647 SET_FLAG (op, FLAG_ANIMATE);
648 }
649 }
650
923 break; 651 break;
652
924 case KW_neutral: 653 case KW_last_heal:
925 GET_FLAG (op, FLAG_NEUTRAL); 654 thawer.get (op->last_heal);
926 break; 655 break;
927 case KW_no_attack: 656 case KW_last_sp:
928 GET_FLAG (op, FLAG_NO_ATTACK); 657 thawer.get (op->last_sp);
929 break; 658 break;
930 case KW_no_damage: 659 case KW_last_grace:
931 GET_FLAG (op, FLAG_NO_DAMAGE); 660 thawer.get (op->last_grace);
932 break; 661 break;
933 case KW_generator: 662 case KW_last_eat:
934 GET_FLAG (op, FLAG_GENERATOR); 663 thawer.get (op->last_eat);
935 break; 664 break;
936 case KW_use_content_on_gen: 665 case KW_speed_left:
937 GET_FLAG (op, FLAG_CONTENT_ON_GEN); 666 thawer.get (op->speed_left);
938 break; 667 break;
939 case KW_is_thrown: 668
940 GET_FLAG (op, FLAG_IS_THROWN);
941 break;
942 case KW_auto_apply:
943 GET_FLAG (op, FLAG_AUTO_APPLY);
944 break;
945 case KW_treasure:
946 GET_FLAG (op, FLAG_TREASURE);
947 break;
948 case KW_see_invisible:
949 GET_FLAG (op, FLAG_SEE_INVISIBLE);
950 break;
951 case KW_can_roll:
952 GET_FLAG (op, FLAG_CAN_ROLL);
953 break;
954 case KW_overlay_floor:
955 GET_FLAG (op, FLAG_OVERLAY_FLOOR);
956 break;
957 case KW_is_turnable:
958 GET_FLAG (op, FLAG_IS_TURNABLE);
959 break;
960 case KW_is_used_up:
961 GET_FLAG (op, FLAG_IS_USED_UP);
962 break;
963 case KW_alive:
964 GET_FLAG (op, FLAG_ALIVE);
965 break;
966 case KW_applied:
967 GET_FLAG (op, FLAG_APPLIED);
968 break;
969 case KW_unpaid:
970 GET_FLAG (op, FLAG_UNPAID);
971 break;
972 case KW_is_animated:
973 GET_FLAG (op, FLAG_ANIMATE);
974 break;
975 case KW_no_pick:
976 GET_FLAG (op, FLAG_NO_PICK);
977 break;
978 case KW_reflecting:
979 GET_FLAG (op, FLAG_REFLECTING);
980 break;
981 case KW_changing:
982 GET_FLAG (op, FLAG_CHANGING);
983 break;
984 case KW_splitting:
985 GET_FLAG (op, FLAG_SPLITTING);
986 break;
987 case KW_hitback:
988 GET_FLAG (op, FLAG_HITBACK);
989 break;
990 case KW_startequip:
991 GET_FLAG (op, FLAG_STARTEQUIP);
992 break;
993 case KW_blocksview:
994 GET_FLAG (op, FLAG_BLOCKSVIEW);
995 break;
996 case KW_undead:
997 GET_FLAG (op, FLAG_UNDEAD);
998 break;
999 case KW_scared:
1000 GET_FLAG (op, FLAG_SCARED);
1001 break;
1002 case KW_unaggressive:
1003 GET_FLAG (op, FLAG_UNAGGRESSIVE);
1004 break;
1005 case KW_reflect_missile:
1006 GET_FLAG (op, FLAG_REFL_MISSILE);
1007 break;
1008 case KW_reflect_spell:
1009 GET_FLAG (op, FLAG_REFL_SPELL);
1010 break;
1011 case KW_no_magic:
1012 GET_FLAG (op, FLAG_NO_MAGIC);
1013 break;
1014 case KW_no_drop:
1015 GET_FLAG (op, FLAG_NO_DROP);
1016 break;
1017 case KW_random_movement:
1018 GET_FLAG (op, FLAG_RANDOM_MOVE);
1019 break;
1020 case KW_was_wiz:
1021 GET_FLAG (op, FLAG_WAS_WIZ);
1022 break;
1023 case KW_no_fix_player:
1024 GET_FLAG (op, FLAG_NO_FIX_PLAYER);
1025 break;
1026 case KW_is_lightable:
1027 GET_FLAG (op, FLAG_IS_LIGHTABLE);
1028 break;
1029 case KW_tear_down:
1030 GET_FLAG (op, FLAG_TEAR_DOWN);
1031 break;
1032 case KW_can_use_shield:
1033 GET_FLAG (op, FLAG_USE_SHIELD);
1034 break;
1035 case KW_can_cast_spell:
1036 GET_FLAG (op, FLAG_CAST_SPELL);
1037 break;
1038 case KW_can_use_scroll:
1039 GET_FLAG (op, FLAG_USE_SCROLL);
1040 break;
1041 case KW_can_use_range:
1042 GET_FLAG (op, FLAG_USE_RANGE);
1043 break;
1044 case KW_can_use_bow:
1045 GET_FLAG (op, FLAG_USE_BOW);
1046 break;
1047 case KW_can_use_armour:
1048 GET_FLAG (op, FLAG_USE_ARMOUR);
1049 break;
1050 case KW_can_use_weapon:
1051 GET_FLAG (op, FLAG_USE_WEAPON);
1052 break;
1053 case KW_can_use_ring:
1054 GET_FLAG (op, FLAG_USE_RING);
1055 break;
1056 case KW_has_ready_bow:
1057 GET_FLAG (op, FLAG_READY_BOW);
1058 break;
1059 case KW_xrays:
1060 GET_FLAG (op, FLAG_XRAYS);
1061 break;
1062 case KW_is_floor:
1063 GET_FLAG (op, FLAG_IS_FLOOR);
1064 break;
1065 case KW_lifesave:
1066 GET_FLAG (op, FLAG_LIFESAVE);
1067 break;
1068 case KW_no_strength:
1069 GET_FLAG (op, FLAG_NO_STRENGTH);
1070 break;
1071 case KW_sleep: 669 case KW_speed:
1072 GET_FLAG (op, FLAG_SLEEP);
1073 break;
1074 case KW_stand_still:
1075 GET_FLAG (op, FLAG_STAND_STILL);
1076 break;
1077 case KW_random_move:
1078 GET_FLAG (op, FLAG_RANDOM_MOVE);
1079 break;
1080 case KW_only_attack:
1081 GET_FLAG (op, FLAG_ONLY_ATTACK);
1082 break;
1083 case KW_activate_on_push:
1084 GET_FLAG (op, FLAG_ACTIVATE_ON_PUSH);
1085 break;
1086 case KW_activate_on_release:
1087 GET_FLAG (op, FLAG_ACTIVATE_ON_RELEASE);
1088 break;
1089 case KW_confused:
1090 GET_FLAG (op, FLAG_CONFUSED);
1091 break;
1092 case KW_stealth:
1093 GET_FLAG (op, FLAG_STEALTH);
1094 break;
1095 case KW_cursed:
1096 GET_FLAG (op, FLAG_CURSED);
1097 break;
1098 case KW_damned:
1099 GET_FLAG (op, FLAG_DAMNED);
1100 break;
1101 case KW_see_anywhere:
1102 GET_FLAG (op, FLAG_SEE_ANYWHERE);
1103 break;
1104 case KW_known_magical:
1105 GET_FLAG (op, FLAG_KNOWN_MAGICAL);
1106 break;
1107 case KW_known_cursed:
1108 GET_FLAG (op, FLAG_KNOWN_CURSED);
1109 break;
1110 case KW_can_use_skill:
1111 GET_FLAG (op, FLAG_CAN_USE_SKILL);
1112 break;
1113 case KW_been_applied:
1114 GET_FLAG (op, FLAG_BEEN_APPLIED);
1115 break;
1116 case KW_has_ready_scroll:
1117 GET_FLAG (op, FLAG_READY_SCROLL);
1118 break;
1119 case KW_can_use_rod:
1120 GET_FLAG (op, FLAG_USE_ROD);
1121 break;
1122 case KW_can_use_horn:
1123 GET_FLAG (op, FLAG_USE_HORN);
1124 break;
1125 case KW_unique:
1126 GET_FLAG (op, FLAG_UNIQUE);
1127 break;
1128 case KW_make_invisible:
1129 GET_FLAG (op, FLAG_MAKE_INVIS);
1130 break;
1131 case KW_inv_locked:
1132 GET_FLAG (op, FLAG_INV_LOCKED);
1133 break;
1134 case KW_is_wooded:
1135 GET_FLAG (op, FLAG_IS_WOODED);
1136 break;
1137 case KW_is_hilly:
1138 GET_FLAG (op, FLAG_IS_HILLY);
1139 break;
1140 case KW_is_water:
1141 GET_FLAG (op, FLAG_IS_WATER);
1142 break;
1143 case KW_has_ready_skill:
1144 GET_FLAG (op, FLAG_READY_SKILL);
1145 break;
1146 case KW_has_ready_weapon:
1147 GET_FLAG (op, FLAG_READY_WEAPON);
1148 break;
1149 case KW_no_skill_ident:
1150 GET_FLAG (op, FLAG_NO_SKILL_IDENT);
1151 break;
1152 case KW_is_blind:
1153 GET_FLAG (op, FLAG_BLIND);
1154 break;
1155 case KW_can_see_in_dark:
1156 GET_FLAG (op, FLAG_SEE_IN_DARK);
1157 break;
1158 case KW_is_cauldron:
1159 GET_FLAG (op, FLAG_IS_CAULDRON);
1160 break;
1161 case KW_no_steal:
1162 GET_FLAG (op, FLAG_NO_STEAL);
1163 break;
1164 case KW_one_hit:
1165 GET_FLAG (op, FLAG_ONE_HIT);
1166 break;
1167 case KW_berserk:
1168 GET_FLAG (op, FLAG_BERSERK);
1169 break;
1170 case KW_is_buildable:
1171 GET_FLAG (op, FLAG_IS_BUILDABLE);
1172 break;
1173
1174 case KW_armour:
1175 thawer.get (op->resist[ATNR_PHYSICAL]);
1176 break;
1177 case KW_resist_physical:
1178 thawer.get (op->resist[ATNR_PHYSICAL]);
1179 break;
1180 case KW_resist_magic:
1181 thawer.get (op->resist[ATNR_MAGIC]);
1182 break;
1183 case KW_resist_fire:
1184 thawer.get (op->resist[ATNR_FIRE]);
1185 break;
1186 case KW_resist_electricity:
1187 thawer.get (op->resist[ATNR_ELECTRICITY]);
1188 break;
1189 case KW_resist_cold:
1190 thawer.get (op->resist[ATNR_COLD]);
1191 break;
1192 case KW_resist_confusion:
1193 thawer.get (op->resist[ATNR_CONFUSION]);
1194 break;
1195 case KW_resist_acid:
1196 thawer.get (op->resist[ATNR_ACID]);
1197 break;
1198 case KW_resist_drain:
1199 thawer.get (op->resist[ATNR_DRAIN]);
1200 break;
1201 case KW_resist_weaponmagic:
1202 thawer.get (op->resist[ATNR_WEAPONMAGIC]);
1203 break;
1204 case KW_resist_ghosthit:
1205 thawer.get (op->resist[ATNR_GHOSTHIT]);
1206 break;
1207 case KW_resist_poison:
1208 thawer.get (op->resist[ATNR_POISON]);
1209 break;
1210 case KW_resist_slow:
1211 thawer.get (op->resist[ATNR_SLOW]);
1212 break;
1213 case KW_resist_paralyze:
1214 thawer.get (op->resist[ATNR_PARALYZE]);
1215 break;
1216 case KW_resist_turn_undead:
1217 thawer.get (op->resist[ATNR_TURN_UNDEAD]);
1218 break;
1219 case KW_resist_fear:
1220 thawer.get (op->resist[ATNR_FEAR]);
1221 break;
1222 case KW_resist_cancellation:
1223 thawer.get (op->resist[ATNR_CANCELLATION]);
1224 break;
1225 case KW_resist_deplete:
1226 thawer.get (op->resist[ATNR_DEPLETE]);
1227 break;
1228 case KW_resist_death:
1229 thawer.get (op->resist[ATNR_DEATH]);
1230 break;
1231 case KW_resist_chaos:
1232 thawer.get (op->resist[ATNR_CHAOS]);
1233 break;
1234 case KW_resist_counterspell:
1235 thawer.get (op->resist[ATNR_COUNTERSPELL]);
1236 break;
1237 case KW_resist_godpower:
1238 thawer.get (op->resist[ATNR_GODPOWER]);
1239 break;
1240 case KW_resist_holyword:
1241 thawer.get (op->resist[ATNR_HOLYWORD]);
1242 break;
1243 case KW_resist_blind:
1244 thawer.get (op->resist[ATNR_BLIND]);
1245 break;
1246 case KW_resist_internal:
1247 thawer.get (op->resist[ATNR_INTERNAL]);
1248 break;
1249 case KW_resist_life_stealing:
1250 thawer.get (op->resist[ATNR_LIFE_STEALING]);
1251 break;
1252 case KW_resist_disease:
1253 thawer.get (op->resist[ATNR_DISEASE]);
1254 break;
1255
1256 case KW_luck:
1257 thawer.get (op->stats.luck);
1258 break;
1259 case KW_run_away:
1260 thawer.get (op->run_away);
1261 break;
1262 case KW_pick_up:
1263 thawer.get (op->pick_up);
1264 break;
1265 case KW_item_power:
1266 thawer.get (op->item_power);
1267 break;
1268 case KW_gen_sp_armour:
1269 thawer.get (op->gen_sp_armour);
1270 break;
1271 case KW_anim_speed:
1272 thawer.get (op->anim_speed); 670 thawer.get (op->speed);
1273 break;
1274 case KW_container:
1275 thawer.get (op->weight_limit);
1276 break;
1277 case KW_will_apply:
1278 thawer.get (op->will_apply);
1279 break;
1280 case KW_attack_movement:
1281 thawer.get (op->attack_movement);
1282 break;
1283 case KW_move_state:
1284 thawer.get (op->move_status);
1285 break;
1286 case KW_expmul:
1287 thawer.get (op->expmul);
1288 break;
1289 case KW_glow_radius:
1290 thawer.get (op->glow_radius);
1291 break;
1292 case KW_weapontype:
1293 thawer.get (op->weapontype);
1294 break;
1295 case KW_tooltype:
1296 thawer.get (op->tooltype);
1297 break;
1298 case KW_casting_time:
1299 thawer.get (op->casting_time);
1300 break;
1301 case KW_elevation:
1302 thawer.get (op->elevation);
1303 break;
1304 case KW_smoothlevel:
1305 thawer.get (op->smoothlevel);
1306 break;
1307 case KW_client_type:
1308 thawer.get (op->client_type);
1309 break;
1310 case KW_duration:
1311 thawer.get (op->duration);
1312 break;
1313 case KW_range:
1314 thawer.get (op->range);
1315 break;
1316 case KW_range_modifier:
1317 thawer.get (op->range_modifier);
1318 break;
1319 case KW_dam_modifier:
1320 thawer.get (op->dam_modifier);
1321 break;
1322 case KW_duration_modifier:
1323 thawer.get (op->duration_modifier);
1324 break;
1325 671
1326 //TODO: mechanism to ensure that KW_xxx is consecutive needed from include/preprocess 672 //TODO: maybe do in check_object
1327 //TODO: parse from other include files 673 if (!(map_flags & MAP_STYLE))
1328 case KW_body_range:
1329 thawer.get (op->body_info[0]);
1330 break;
1331 case KW_body_arm:
1332 thawer.get (op->body_info[1]);
1333 break;
1334 case KW_body_torso:
1335 thawer.get (op->body_info[2]);
1336 break;
1337 case KW_body_head:
1338 thawer.get (op->body_info[3]);
1339 break;
1340 case KW_body_neck:
1341 thawer.get (op->body_info[4]);
1342 break;
1343 case KW_body_skill:
1344 thawer.get (op->body_info[5]);
1345 break;
1346 case KW_body_finger:
1347 thawer.get (op->body_info[6]);
1348 break;
1349 case KW_body_shoulder:
1350 thawer.get (op->body_info[7]);
1351 break;
1352 case KW_body_foot:
1353 thawer.get (op->body_info[8]);
1354 break;
1355 case KW_body_hand:
1356 thawer.get (op->body_info[9]);
1357 break;
1358 case KW_body_wrist:
1359 thawer.get (op->body_info[10]);
1360 break;
1361 case KW_body_waist:
1362 thawer.get (op->body_info[11]);
1363 break;
1364 case KW_can_apply:
1365 break;
1366
1367 case KW_connected:
1368 add_button_link (op, op->map, thawer.get_sint32 ());
1369 break;
1370
1371 case KW_randomitems:
1372 op->randomitems = find_treasurelist (thawer.get_str ());
1373 break;
1374
1375 case KW_msg:
1376 { 674 {
1377 thawer.get_ml (KW_endmsg, op->msg); 675 if (op->speed < 0)
1378 //TODO: allow longer messages 676 op->speed_left = op->speed_left - RANDOM () % 100 / 100.0;
1379 if (strlen (op->msg) >= HUGE_BUF) 677
1380 { 678 update_ob_speed (op);
1381 LOG (llevDebug, "\n\tError message length >= %d: %d\n>%.80s<\n", HUGE_BUF, strlen (op->msg), &op->msg);
1382 op->msg = "ERROR, please report: string too long, winged.\n";
1383 }
1384 } 679 }
680
1385 break; 681 break;
1386 682
683 case KW_slow_move:
684 op->move_slow |= MOVE_WALK;
685 thawer.get (op->move_slow_penalty);
686 break;
687
688 case KW_face:
689 op->face = &new_faces[FindFace (thawer.get_str (), 0)];
690 break;
691
692 case KW_x:
693 thawer.get (op->x);
694 break;
695 case KW_y:
696 thawer.get (op->y);
697 break;
698 case KW_Str: // uppercase alias
699 case KW_str:
700 thawer.get (op->stats.Str);
701 break;
702 case KW_Dex: // uppercase alias
703 case KW_dex:
704 thawer.get (op->stats.Dex);
705 break;
706 case KW_Con: // uppercase alias
707 case KW_con:
708 thawer.get (op->stats.Con);
709 break;
710 case KW_Wis: // uppercase alias
711 case KW_wis:
712 thawer.get (op->stats.Wis);
713 break;
714 case KW_Cha: // uppercase alias
715 case KW_cha:
716 thawer.get (op->stats.Cha);
717 break;
718 case KW_Int: // uppercase alias
719 case KW_int:
720 thawer.get (op->stats.Int);
721 break;
722 case KW_Pow: // uppercase alias
723 case KW_pow:
724 thawer.get (op->stats.Pow);
725 break;
726 case KW_hp:
727 thawer.get (op->stats.hp);
728 break;
729 case KW_maxhp:
730 thawer.get (op->stats.maxhp);
731 break;
732 case KW_sp:
733 thawer.get (op->stats.sp);
734 break;
735 case KW_maxsp:
736 thawer.get (op->stats.maxsp);
737 break;
1387 case KW_lore: 738 case KW_grace:
739 thawer.get (op->stats.grace);
740 break;
741 case KW_maxgrace:
742 thawer.get (op->stats.maxgrace);
743 break;
744
745 case KW_exp:
746 thawer.get (op->stats.exp);
747 break;
748 case KW_perm_exp:
749 thawer.get (op->perm_exp);
750 break;
751 case KW_food:
752 thawer.get (op->stats.food);
753 break;
754 case KW_dam:
755 thawer.get (op->stats.dam);
756 break;
757 case KW_wc:
758 thawer.get (op->stats.wc);
759 break;
760 case KW_ac:
761 thawer.get (op->stats.ac);
762 break;
763 case KW_nrof:
764 thawer.get (op->nrof);
765 break;
766 case KW_level:
767 thawer.get (op->level);
768 break;
769 case KW_direction:
770 thawer.get (op->direction);
771 break;
772 case KW_type:
773 thawer.get (op->type);
774 break;
775 case KW_subtype:
776 thawer.get (op->subtype);
777 break;
778 case KW_value:
779 thawer.get (op->value);
780 break;
781 case KW_weight:
782 thawer.get (op->weight);
783 break;
784 case KW_carrying:
785 thawer.get (op->carrying);
786 break;
787 case KW_attacktype:
788 thawer.get (op->attacktype);
789 break;
790 case KW_path_attuned:
791 thawer.get (op->path_attuned);
792 break;
793 case KW_path_repelled:
794 thawer.get (op->path_repelled);
795 break;
796 case KW_path_denied:
797 thawer.get (op->path_denied);
798 break;
799 case KW_invisible:
800 thawer.get (op->invisible);
801 break;
802 case KW_magic:
803 thawer.get (op->magic);
804 break;
805 case KW_state:
806 thawer.get (op->state);
807 break;
808 case KW_move_slow_penalty:
809 thawer.get (op->move_slow_penalty);
810 break;
811 case KW_material:
812 thawer.get (op->material);
813 break;
814 case KW_materialname:
815 thawer.get (op->materialname);
816 break;
817
818 /* These are the new values */
819 case KW_move_block:
820 set_move (op->move_block, thawer.get_str ());
821 break;
822 case KW_move_allow:
823 set_move (op->move_allow, thawer.get_str ());
824 break;
825 case KW_move_type:
826 set_move (op->move_type, thawer.get_str ());
827 break;
828 case KW_move_on:
829 set_move (op->move_on, thawer.get_str ());
830 break;
831 case KW_move_off:
832 set_move (op->move_off, thawer.get_str ());
833 break;
834 case KW_move_slow:
835 set_move (op->move_slow, thawer.get_str ());
836 break;
837
838 /* These are all legacy - any new objects should use the move_ .. values */
839 case KW_no_pass:
840 {
841 if (thawer.get_sint32 ())
842 op->move_block = MOVE_ALL;
843 else
844 op->move_block = 0;
845 }
846
847 break;
848
849 /* These are all legacy - any new objects should use the move_ .. values */
850 case KW_walk_on:
851 {
852 if (thawer.get_sint32 ())
853 op->move_on |= MOVE_WALK;
854 else
855 op->move_on &= ~MOVE_WALK;
856 }
857
858 break;
859
860 /* These are all legacy - any new objects should use the move_ .. values */
861 case KW_walk_off:
862 {
863 if (thawer.get_sint32 ())
864 op->move_off |= MOVE_WALK;
865 else
866 op->move_off &= ~MOVE_WALK;
867 }
868 break;
869
870 /* These are all legacy - any new objects should use the move_ .. values */
871 case KW_fly_on:
872 {
873 if (thawer.get_sint32 ())
874 op->move_on |= MOVE_FLY_LOW;
875 else
876 op->move_on &= ~MOVE_FLY_LOW;
877 }
878 break;
879
880 /* These are all legacy - any new objects should use the move_ .. values */
881 case KW_fly_off:
882 {
883 if (thawer.get_sint32 ())
884 op->move_off |= MOVE_FLY_LOW;
885 else
886 op->move_off &= ~MOVE_FLY_LOW;
887 }
888 break;
889
890 //TODO: remove these after convertign archetypes
891 case KW_can_use_wand:
892 GET_FLAG (op, FLAG_USE_RANGE);
893 break;
894
895 /* These are all legacy - any new objects should use the move_ .. values */
896 case KW_flying:
897 {
898 if (thawer.get_sint32 ())
899 op->move_type |= MOVE_FLY_LOW;
900 else
901 op->move_type &= ~MOVE_FLY_LOW;
902 }
903 break;
904
905
906 case KW_identified:
907 GET_FLAG (op, FLAG_IDENTIFIED);
908 //TODO: move to check_object or so
909 if (QUERY_FLAG (op, FLAG_IDENTIFIED))
910 CLEAR_FLAG (op, FLAG_KNOWN_MAGICAL);
911
912 break;
913
914 case KW_wiz:
915 GET_FLAG (op, FLAG_WIZ);
916 //TODO: move to check_object
917 if (QUERY_FLAG (op, FLAG_WIZ))
1388 { 918 {
1389 shstr msgbuf; 919 SET_FLAG (op, FLAG_WAS_WIZ);
1390 920 SET_FLAG (op, FLAG_WIZPASS);
1391 thawer.get_ml (KW_endlore, op->lore); 921 SET_FLAG (op, FLAG_WIZCAST);
1392 //TODO: allow longer messages
1393 /* Just print a warning so we can be reasonably safe
1394 * about not overflowing the buffer.
1395 */
1396 if (strlen (op->lore) > (HUGE_BUF / 2))
1397 LOG (llevDebug, "\n\tWarning lore length > %d (max allowed=%d): %d\n>%.80s<\n",
1398 HUGE_BUF / 2, HUGE_BUF, strlen (op->lore), &op->lore);
1399 } 922 }
923 else
924 {
925 CLEAR_FLAG (op, FLAG_WIZPASS);
926 CLEAR_FLAG (op, FLAG_WIZCAST);
927 }
1400 break; 928 break;
1401 929
1402 case KW_editable: 930 case KW_friendly:
1403 case KW_editor_folder: 931 GET_FLAG (op, FLAG_FRIENDLY);
932 //TODO: move to check_object or so
933 if (op->type != PLAYER && QUERY_FLAG (op, FLAG_FRIENDLY))
934 add_friendly_object (op);
1404 break; 935 break;
1405 936
1406 case KW_More: // uppercase alias 937 case KW_monster:
938 GET_FLAG (op, FLAG_MONSTER);
939 break;
940 case KW_neutral:
941 GET_FLAG (op, FLAG_NEUTRAL);
942 break;
943 case KW_no_attack:
944 GET_FLAG (op, FLAG_NO_ATTACK);
945 break;
946 case KW_no_damage:
947 GET_FLAG (op, FLAG_NO_DAMAGE);
948 break;
949 case KW_generator:
950 GET_FLAG (op, FLAG_GENERATOR);
951 break;
952 case KW_use_content_on_gen:
953 GET_FLAG (op, FLAG_CONTENT_ON_GEN);
954 break;
955 case KW_is_thrown:
956 GET_FLAG (op, FLAG_IS_THROWN);
957 break;
958 case KW_auto_apply:
959 GET_FLAG (op, FLAG_AUTO_APPLY);
960 break;
961 case KW_treasure:
962 GET_FLAG (op, FLAG_TREASURE);
963 break;
964 case KW_see_invisible:
965 GET_FLAG (op, FLAG_SEE_INVISIBLE);
966 break;
967 case KW_can_roll:
968 GET_FLAG (op, FLAG_CAN_ROLL);
969 break;
970 case KW_overlay_floor:
971 GET_FLAG (op, FLAG_OVERLAY_FLOOR);
972 break;
973 case KW_is_turnable:
974 GET_FLAG (op, FLAG_IS_TURNABLE);
975 break;
976 case KW_is_used_up:
977 GET_FLAG (op, FLAG_IS_USED_UP);
978 break;
979 case KW_alive:
980 GET_FLAG (op, FLAG_ALIVE);
981 break;
982 case KW_applied:
983 GET_FLAG (op, FLAG_APPLIED);
984 break;
985 case KW_unpaid:
986 GET_FLAG (op, FLAG_UNPAID);
987 break;
988 case KW_is_animated:
989 GET_FLAG (op, FLAG_ANIMATE);
990 break;
991 case KW_no_pick:
992 GET_FLAG (op, FLAG_NO_PICK);
993 break;
994 case KW_reflecting:
995 GET_FLAG (op, FLAG_REFLECTING);
996 break;
997 case KW_changing:
998 GET_FLAG (op, FLAG_CHANGING);
999 break;
1000 case KW_splitting:
1001 GET_FLAG (op, FLAG_SPLITTING);
1002 break;
1003 case KW_hitback:
1004 GET_FLAG (op, FLAG_HITBACK);
1005 break;
1006 case KW_startequip:
1007 GET_FLAG (op, FLAG_STARTEQUIP);
1008 break;
1009 case KW_blocksview:
1010 GET_FLAG (op, FLAG_BLOCKSVIEW);
1011 break;
1012 case KW_undead:
1013 GET_FLAG (op, FLAG_UNDEAD);
1014 break;
1015 case KW_scared:
1016 GET_FLAG (op, FLAG_SCARED);
1017 break;
1018 case KW_unaggressive:
1019 GET_FLAG (op, FLAG_UNAGGRESSIVE);
1020 break;
1021 case KW_reflect_missile:
1022 GET_FLAG (op, FLAG_REFL_MISSILE);
1023 break;
1024 case KW_reflect_spell:
1025 GET_FLAG (op, FLAG_REFL_SPELL);
1026 break;
1027 case KW_no_magic:
1028 GET_FLAG (op, FLAG_NO_MAGIC);
1029 break;
1030 case KW_no_drop:
1031 GET_FLAG (op, FLAG_NO_DROP);
1032 break;
1033 case KW_random_movement:
1034 GET_FLAG (op, FLAG_RANDOM_MOVE);
1035 break;
1036 case KW_was_wiz:
1037 GET_FLAG (op, FLAG_WAS_WIZ);
1038 break;
1039 case KW_no_fix_player:
1040 GET_FLAG (op, FLAG_NO_FIX_PLAYER);
1041 break;
1042 case KW_is_lightable:
1043 GET_FLAG (op, FLAG_IS_LIGHTABLE);
1044 break;
1045 case KW_tear_down:
1046 GET_FLAG (op, FLAG_TEAR_DOWN);
1047 break;
1048 case KW_can_use_shield:
1049 GET_FLAG (op, FLAG_USE_SHIELD);
1050 break;
1051 case KW_can_cast_spell:
1052 GET_FLAG (op, FLAG_CAST_SPELL);
1053 break;
1054 case KW_can_use_scroll:
1055 GET_FLAG (op, FLAG_USE_SCROLL);
1056 break;
1057 case KW_can_use_range:
1058 GET_FLAG (op, FLAG_USE_RANGE);
1059 break;
1060 case KW_can_use_bow:
1061 GET_FLAG (op, FLAG_USE_BOW);
1062 break;
1063 case KW_can_use_armour:
1064 GET_FLAG (op, FLAG_USE_ARMOUR);
1065 break;
1066 case KW_can_use_weapon:
1067 GET_FLAG (op, FLAG_USE_WEAPON);
1068 break;
1069 case KW_can_use_ring:
1070 GET_FLAG (op, FLAG_USE_RING);
1071 break;
1072 case KW_has_ready_bow:
1073 GET_FLAG (op, FLAG_READY_BOW);
1074 break;
1075 case KW_xrays:
1076 GET_FLAG (op, FLAG_XRAYS);
1077 break;
1078 case KW_is_floor:
1079 GET_FLAG (op, FLAG_IS_FLOOR);
1080 break;
1081 case KW_lifesave:
1082 GET_FLAG (op, FLAG_LIFESAVE);
1083 break;
1084 case KW_no_strength:
1085 GET_FLAG (op, FLAG_NO_STRENGTH);
1086 break;
1087 case KW_sleep:
1088 GET_FLAG (op, FLAG_SLEEP);
1089 break;
1090 case KW_stand_still:
1091 GET_FLAG (op, FLAG_STAND_STILL);
1092 break;
1093 case KW_random_move:
1094 GET_FLAG (op, FLAG_RANDOM_MOVE);
1095 break;
1096 case KW_only_attack:
1097 GET_FLAG (op, FLAG_ONLY_ATTACK);
1098 break;
1099 case KW_activate_on_push:
1100 GET_FLAG (op, FLAG_ACTIVATE_ON_PUSH);
1101 break;
1102 case KW_activate_on_release:
1103 GET_FLAG (op, FLAG_ACTIVATE_ON_RELEASE);
1104 break;
1105 case KW_confused:
1106 GET_FLAG (op, FLAG_CONFUSED);
1107 break;
1108 case KW_stealth:
1109 GET_FLAG (op, FLAG_STEALTH);
1110 break;
1111 case KW_cursed:
1112 GET_FLAG (op, FLAG_CURSED);
1113 break;
1114 case KW_damned:
1115 GET_FLAG (op, FLAG_DAMNED);
1116 break;
1117 case KW_see_anywhere:
1118 GET_FLAG (op, FLAG_SEE_ANYWHERE);
1119 break;
1120 case KW_known_magical:
1121 GET_FLAG (op, FLAG_KNOWN_MAGICAL);
1122 break;
1123 case KW_known_cursed:
1124 GET_FLAG (op, FLAG_KNOWN_CURSED);
1125 break;
1126 case KW_can_use_skill:
1127 GET_FLAG (op, FLAG_CAN_USE_SKILL);
1128 break;
1129 case KW_been_applied:
1130 GET_FLAG (op, FLAG_BEEN_APPLIED);
1131 break;
1132 case KW_has_ready_scroll:
1133 GET_FLAG (op, FLAG_READY_SCROLL);
1134 break;
1135 case KW_can_use_rod:
1136 GET_FLAG (op, FLAG_USE_ROD);
1137 break;
1138 case KW_can_use_horn:
1139 GET_FLAG (op, FLAG_USE_HORN);
1140 break;
1141 case KW_unique:
1142 GET_FLAG (op, FLAG_UNIQUE);
1143 break;
1144 case KW_make_invisible:
1145 GET_FLAG (op, FLAG_MAKE_INVIS);
1146 break;
1147 case KW_inv_locked:
1148 GET_FLAG (op, FLAG_INV_LOCKED);
1149 break;
1150 case KW_is_wooded:
1151 GET_FLAG (op, FLAG_IS_WOODED);
1152 break;
1153 case KW_is_hilly:
1154 GET_FLAG (op, FLAG_IS_HILLY);
1155 break;
1156 case KW_is_water:
1157 GET_FLAG (op, FLAG_IS_WATER);
1158 break;
1159 case KW_has_ready_skill:
1160 GET_FLAG (op, FLAG_READY_SKILL);
1161 break;
1162 case KW_has_ready_weapon:
1163 GET_FLAG (op, FLAG_READY_WEAPON);
1164 break;
1165 case KW_no_skill_ident:
1166 GET_FLAG (op, FLAG_NO_SKILL_IDENT);
1167 break;
1168 case KW_is_blind:
1169 GET_FLAG (op, FLAG_BLIND);
1170 break;
1171 case KW_can_see_in_dark:
1172 GET_FLAG (op, FLAG_SEE_IN_DARK);
1173 break;
1174 case KW_is_cauldron:
1175 GET_FLAG (op, FLAG_IS_CAULDRON);
1176 break;
1177 case KW_no_steal:
1178 GET_FLAG (op, FLAG_NO_STEAL);
1179 break;
1180 case KW_one_hit:
1181 GET_FLAG (op, FLAG_ONE_HIT);
1182 break;
1183 case KW_berserk:
1184 GET_FLAG (op, FLAG_BERSERK);
1185 break;
1186 case KW_is_buildable:
1187 GET_FLAG (op, FLAG_IS_BUILDABLE);
1188 break;
1189
1190 case KW_armour:
1191 thawer.get (op->resist[ATNR_PHYSICAL]);
1192 break;
1193 case KW_resist_physical:
1194 thawer.get (op->resist[ATNR_PHYSICAL]);
1195 break;
1196 case KW_resist_magic:
1197 thawer.get (op->resist[ATNR_MAGIC]);
1198 break;
1199 case KW_resist_fire:
1200 thawer.get (op->resist[ATNR_FIRE]);
1201 break;
1202 case KW_resist_electricity:
1203 thawer.get (op->resist[ATNR_ELECTRICITY]);
1204 break;
1205 case KW_resist_cold:
1206 thawer.get (op->resist[ATNR_COLD]);
1207 break;
1208 case KW_resist_confusion:
1209 thawer.get (op->resist[ATNR_CONFUSION]);
1210 break;
1211 case KW_resist_acid:
1212 thawer.get (op->resist[ATNR_ACID]);
1213 break;
1214 case KW_resist_drain:
1215 thawer.get (op->resist[ATNR_DRAIN]);
1216 break;
1217 case KW_resist_weaponmagic:
1218 thawer.get (op->resist[ATNR_WEAPONMAGIC]);
1219 break;
1220 case KW_resist_ghosthit:
1221 thawer.get (op->resist[ATNR_GHOSTHIT]);
1222 break;
1223 case KW_resist_poison:
1224 thawer.get (op->resist[ATNR_POISON]);
1225 break;
1226 case KW_resist_slow:
1227 thawer.get (op->resist[ATNR_SLOW]);
1228 break;
1229 case KW_resist_paralyze:
1230 thawer.get (op->resist[ATNR_PARALYZE]);
1231 break;
1232 case KW_resist_turn_undead:
1233 thawer.get (op->resist[ATNR_TURN_UNDEAD]);
1234 break;
1235 case KW_resist_fear:
1236 thawer.get (op->resist[ATNR_FEAR]);
1237 break;
1238 case KW_resist_cancellation:
1239 thawer.get (op->resist[ATNR_CANCELLATION]);
1240 break;
1241 case KW_resist_deplete:
1242 thawer.get (op->resist[ATNR_DEPLETE]);
1243 break;
1244 case KW_resist_death:
1245 thawer.get (op->resist[ATNR_DEATH]);
1246 break;
1247 case KW_resist_chaos:
1248 thawer.get (op->resist[ATNR_CHAOS]);
1249 break;
1250 case KW_resist_counterspell:
1251 thawer.get (op->resist[ATNR_COUNTERSPELL]);
1252 break;
1253 case KW_resist_godpower:
1254 thawer.get (op->resist[ATNR_GODPOWER]);
1255 break;
1256 case KW_resist_holyword:
1257 thawer.get (op->resist[ATNR_HOLYWORD]);
1258 break;
1259 case KW_resist_blind:
1260 thawer.get (op->resist[ATNR_BLIND]);
1261 break;
1262 case KW_resist_internal:
1263 thawer.get (op->resist[ATNR_INTERNAL]);
1264 break;
1265 case KW_resist_life_stealing:
1266 thawer.get (op->resist[ATNR_LIFE_STEALING]);
1267 break;
1268 case KW_resist_disease:
1269 thawer.get (op->resist[ATNR_DISEASE]);
1270 break;
1271
1272 case KW_luck:
1273 thawer.get (op->stats.luck);
1274 break;
1275 case KW_run_away:
1276 thawer.get (op->run_away);
1277 break;
1278 case KW_pick_up:
1279 thawer.get (op->pick_up);
1280 break;
1281 case KW_item_power:
1282 thawer.get (op->item_power);
1283 break;
1284 case KW_gen_sp_armour:
1285 thawer.get (op->gen_sp_armour);
1286 break;
1287 case KW_anim_speed:
1288 thawer.get (op->anim_speed);
1289 break;
1290 case KW_container:
1291 thawer.get (op->weight_limit);
1292 break;
1293 case KW_will_apply:
1294 thawer.get (op->will_apply);
1295 break;
1296 case KW_attack_movement:
1297 thawer.get (op->attack_movement);
1298 break;
1299 case KW_move_state:
1300 thawer.get (op->move_status);
1301 break;
1302 case KW_expmul:
1303 thawer.get (op->expmul);
1304 break;
1305 case KW_glow_radius:
1306 thawer.get (op->glow_radius);
1307 break;
1308 case KW_weapontype:
1309 thawer.get (op->weapontype);
1310 break;
1311 case KW_tooltype:
1312 thawer.get (op->tooltype);
1313 break;
1314 case KW_casting_time:
1315 thawer.get (op->casting_time);
1316 break;
1317 case KW_elevation:
1318 thawer.get (op->elevation);
1319 break;
1320 case KW_smoothlevel:
1321 thawer.get (op->smoothlevel);
1322 break;
1323 case KW_client_type:
1324 thawer.get (op->client_type);
1325 break;
1326 case KW_duration:
1327 thawer.get (op->duration);
1328 break;
1329 case KW_range:
1330 thawer.get (op->range);
1331 break;
1332 case KW_range_modifier:
1333 thawer.get (op->range_modifier);
1334 break;
1335 case KW_dam_modifier:
1336 thawer.get (op->dam_modifier);
1337 break;
1338 case KW_duration_modifier:
1339 thawer.get (op->duration_modifier);
1340 break;
1341
1342 //TODO: mechanism to ensure that KW_xxx is consecutive needed from include/preprocess
1343 //TODO: parse from other include files
1344 case KW_body_range:
1345 thawer.get (op->body_info[0]);
1346 break;
1347 case KW_body_arm:
1348 thawer.get (op->body_info[1]);
1349 break;
1350 case KW_body_torso:
1351 thawer.get (op->body_info[2]);
1352 break;
1353 case KW_body_head:
1354 thawer.get (op->body_info[3]);
1355 break;
1356 case KW_body_neck:
1357 thawer.get (op->body_info[4]);
1358 break;
1359 case KW_body_skill:
1360 thawer.get (op->body_info[5]);
1361 break;
1362 case KW_body_finger:
1363 thawer.get (op->body_info[6]);
1364 break;
1365 case KW_body_shoulder:
1366 thawer.get (op->body_info[7]);
1367 break;
1368 case KW_body_foot:
1369 thawer.get (op->body_info[8]);
1370 break;
1371 case KW_body_hand:
1372 thawer.get (op->body_info[9]);
1373 break;
1374 case KW_body_wrist:
1375 thawer.get (op->body_info[10]);
1376 break;
1377 case KW_body_waist:
1378 thawer.get (op->body_info[11]);
1379 break;
1380 case KW_can_apply:
1381 break;
1382
1383 case KW_connected:
1384 add_button_link (op, op->map, thawer.get_sint32 ());
1385 break;
1386
1387 case KW_randomitems:
1388 op->randomitems = find_treasurelist (thawer.get_str ());
1389 break;
1390
1391 case KW_msg:
1392 {
1393 thawer.get_ml (KW_endmsg, op->msg);
1394 //TODO: allow longer messages
1395 if (strlen (op->msg) >= HUGE_BUF)
1396 {
1397 LOG (llevDebug, "\n\tError message length >= %d: %d\n>%.80s<\n", HUGE_BUF, strlen (op->msg), &op->msg);
1398 op->msg = "ERROR, please report: string too long, winged.\n";
1399 }
1400 }
1401 break;
1402
1407 case KW_more: 1403 case KW_lore:
1408 /* We need to record that this is a multipart object, 1404 {
1409 * so the calling function can glue things back together 1405 shstr msgbuf;
1406
1407 thawer.get_ml (KW_endlore, op->lore);
1408 //TODO: allow longer messages
1409 /* Just print a warning so we can be reasonably safe
1410 * about not overflowing the buffer.
1410 */ 1411 */
1412 if (strlen (op->lore) > (HUGE_BUF / 2))
1413 LOG (llevDebug, "\n\tWarning lore length > %d (max allowed=%d): %d\n>%.80s<\n",
1414 HUGE_BUF / 2, HUGE_BUF, strlen (op->lore), &op->lore);
1415 }
1416 break;
1417
1418 case KW_editable:
1419 case KW_editor_folder:
1420 break;
1421
1422 case KW_More: // uppercase alias
1423 case KW_more:
1424 /* We need to record that this is a multipart object,
1425 * so the calling function can glue things back together
1426 */
1411 ismore = 1; 1427 ismore = 1;
1412 break; 1428 break;
1413 1429
1414 case KW_end: 1430 case KW_end:
1415 check_loaded_object (op); 1431 check_loaded_object (op);
1416 1432
1417 if (!arch_init) 1433 if (!arch_init)
1418 op->instantiate (); 1434 op->instantiate ();
1419 1435
1420 return ismore ? LL_MORE : LL_NORMAL; 1436 return ismore ? LL_MORE : LL_NORMAL;
1421 1437
1422 case KW_EOF: 1438 case KW_EOF:
1423 return LL_EOF; 1439 return LL_EOF;
1424 1440
1425 case KW_ERROR: 1441 case KW_ERROR:
1426 set_ob_key_value (op, thawer.line, thawer.last_value, true); 1442 set_ob_key_value (op, thawer.line, thawer.last_value, true);
1427 //printf ("addkv(%s,%s)\n", thawer.line, thawer.get_str());//D 1443 //printf ("addkv(%s,%s)\n", thawer.line, thawer.get_str());//D
1428 1444
1429 //TODO: skip line, ugly, factor parsing better 1445 //TODO: skip line, ugly, factor parsing better
1430 if (thawer.last_value) 1446 if (thawer.last_value)
1431 thawer.line = thawer.last_value; 1447 thawer.line = thawer.last_value;
1432 1448
1433 thawer.line += strlen (thawer.line) + 1; 1449 thawer.line += strlen (thawer.line) + 1;
1434 1450
1435 break; 1451 break;
1436 1452
1437 default: 1453 default:
1438 LOG (llevError, "UNSUPPORTED KEYWORD IN MAP: \"%s\", bug in normaliser. skipping.\n", keyword_str[kw]); 1454 LOG (llevError, "UNSUPPORTED KEYWORD IN MAP: \"%s\", bug in normaliser. skipping.\n", keyword_str[kw]);
1439 break; 1455 break;
1440 } 1456 }
1441 } 1457 }
1442} 1458}
1443 1459
1444/* 1460/*
1592} 1608}
1593#endif 1609#endif
1594 1610
1595// compare *op against *tmp and output differences 1611// compare *op against *tmp and output differences
1596void 1612void
1597put (object_freezer & f, object *op, object *tmp) 1613put (object_freezer &f, object *op, object *tmp)
1598{ 1614{
1599 int i; 1615 int i;
1600 1616
1601 /* This saves the key/value lists. We do it first so that any 1617 /* This saves the key/value lists. We do it first so that any
1602 * keys that match field names will be overwritten by the loader. 1618 * keys that match field names will be overwritten by the loader.
1612 } 1628 }
1613 1629
1614 /* We don't need to worry about the arch's extra fields - they 1630 /* We don't need to worry about the arch's extra fields - they
1615 * will get taken care of the copy_object function. 1631 * will get taken care of the copy_object function.
1616 */ 1632 */
1633
1634 {
1635 char uids[64];
1636 snprintf (uids, sizeof (uids), "<1.%llx>", (unsigned long long)op->uuid.seq);
1637 f.put (KW_uuid, (const char *)uids);
1638 }
1617 1639
1618#define CMP_OUT(v) if (op->v != tmp->v) f.put (KW_ ## v, op->v) 1640#define CMP_OUT(v) if (op->v != tmp->v) f.put (KW_ ## v, op->v)
1619#define CMP_OUT2(k,v) if (op->v != tmp->v) f.put (KW_ ## k, op->v) 1641#define CMP_OUT2(k,v) if (op->v != tmp->v) f.put (KW_ ## k, op->v)
1620 1642
1621 CMP_OUT (name); 1643 CMP_OUT (name);
1810 } 1832 }
1811 1833
1812 fp.put (op); 1834 fp.put (op);
1813 fprintf (fp, "end\n"); 1835 fprintf (fp, "end\n");
1814} 1836}
1837

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines