… | |
… | |
42 | |
42 | |
43 | static const hook_entry plug_hooks[NR_OF_HOOKS] = { |
43 | static const hook_entry plug_hooks[NR_OF_HOOKS] = { |
44 | {cfapi_system_register_global_event, 1, "cfapi_system_register_global_event"}, |
44 | {cfapi_system_register_global_event, 1, "cfapi_system_register_global_event"}, |
45 | {cfapi_system_unregister_global_event, 3, "cfapi_system_unregister_global_event"}, |
45 | {cfapi_system_unregister_global_event, 3, "cfapi_system_unregister_global_event"}, |
46 | {cfapi_system_check_path, 4, "cfapi_system_check_path"}, |
46 | {cfapi_system_check_path, 4, "cfapi_system_check_path"}, |
47 | {cfapi_system_re_cmp, 5, "cfapi_system_re_cmp"}, |
47 | {NULL, 5, "cfapi_system_re_cmp"}, |
48 | {cfapi_system_strdup_local, 6, "cfapi_system_strdup_local"}, |
48 | {cfapi_system_strdup_local, 6, "cfapi_system_strdup_local"}, |
49 | {cfapi_system_directory, 7, "cfapi_system_directory"}, |
49 | {cfapi_system_directory, 7, "cfapi_system_directory"}, |
50 | {cfapi_system_find_animation, 8, "cfapi_system_find_animation"}, |
50 | {cfapi_system_find_animation, 8, "cfapi_system_find_animation"}, |
51 | {cfapi_object_clean_object, 9, "cfapi_object_clean_object"}, |
51 | {cfapi_object_clean_object, 9, "cfapi_object_clean_object"}, |
52 | {cfapi_object_on_same_map, 10, "cfapi_object_on_same_map"}, |
52 | {cfapi_object_on_same_map, 10, "cfapi_object_on_same_map"}, |
… | |
… | |
121 | |
121 | |
122 | /* NEW PLUGIN STUFF STARTS HERE */ |
122 | /* NEW PLUGIN STUFF STARTS HERE */ |
123 | |
123 | |
124 | /*****************************************************************************/ |
124 | /*****************************************************************************/ |
125 | |
125 | |
126 | #ifdef WIN32 |
|
|
127 | static const char * |
|
|
128 | plugins_dlerror (void) |
|
|
129 | { |
|
|
130 | static char buf[256]; |
|
|
131 | DWORD err; |
|
|
132 | char *p; |
|
|
133 | |
|
|
134 | err = GetLastError (); |
|
|
135 | if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, sizeof (buf), NULL) == 0) |
|
|
136 | snprintf (buf, sizeof (buf), "error %lu", err); |
|
|
137 | p = strchr (buf, '\0'); |
|
|
138 | while (p > buf && (p[-1] == '\r' || p[-1] == '\n')) |
|
|
139 | p--; |
|
|
140 | *p = '\0'; |
|
|
141 | return buf; |
|
|
142 | } |
|
|
143 | #endif /* WIN32 */ |
|
|
144 | |
|
|
145 | /** |
126 | /** |
146 | * Notify clients about a changed object. |
127 | * Notify clients about a changed object. |
147 | * |
128 | * |
148 | * @param op the object that has changed |
129 | * @param op the object that has changed |
149 | */ |
130 | */ |
… | |
… | |
575 | *type = CFAPI_INT; |
556 | *type = CFAPI_INT; |
576 | return &rv; |
557 | return &rv; |
577 | } |
558 | } |
578 | |
559 | |
579 | void * |
560 | void * |
580 | cfapi_system_re_cmp (int *type, ...) |
|
|
581 | { |
|
|
582 | va_list args; |
|
|
583 | char *rv; |
|
|
584 | const char *str; |
|
|
585 | const char *regexp; |
|
|
586 | |
|
|
587 | va_start (args, type); |
|
|
588 | |
|
|
589 | str = va_arg (args, char *); |
|
|
590 | regexp = va_arg (args, char *); |
|
|
591 | |
|
|
592 | rv = (char *) re_cmp (str, regexp); |
|
|
593 | |
|
|
594 | va_end (args); |
|
|
595 | *type = CFAPI_STRING; |
|
|
596 | return rv; |
|
|
597 | } |
|
|
598 | |
|
|
599 | void * |
|
|
600 | cfapi_system_directory (int *type, ...) |
561 | cfapi_system_directory (int *type, ...) |
601 | { |
562 | { |
602 | va_list args; |
563 | va_list args; |
603 | int dirtype; |
564 | int dirtype; |
604 | |
565 | |
… | |
… | |
1676 | rv = &op->stats.exp; |
1637 | rv = &op->stats.exp; |
1677 | *type = CFAPI_LONG; |
1638 | *type = CFAPI_LONG; |
1678 | break; |
1639 | break; |
1679 | |
1640 | |
1680 | case CFAPI_OBJECT_PROP_OWNER: |
1641 | case CFAPI_OBJECT_PROP_OWNER: |
1681 | rv = get_owner (op); |
1642 | rv = op->owner; |
1682 | *type = CFAPI_POBJECT; |
1643 | *type = CFAPI_POBJECT; |
1683 | break; |
1644 | break; |
1684 | |
1645 | |
1685 | case CFAPI_OBJECT_PROP_PRESENT: |
1646 | case CFAPI_OBJECT_PROP_PRESENT: |
1686 | { |
1647 | { |
… | |
… | |
1728 | case CFAPI_OBJECT_PROP_MERGEABLE: |
1689 | case CFAPI_OBJECT_PROP_MERGEABLE: |
1729 | { |
1690 | { |
1730 | object *op2; |
1691 | object *op2; |
1731 | op2 = va_arg (args, object *); |
1692 | op2 = va_arg (args, object *); |
1732 | |
1693 | |
1733 | ri = CAN_MERGE (op, op2); |
1694 | ri = object::can_merge_slow (op, op2); |
1734 | rv = &ri; |
1695 | rv = &ri; |
1735 | } |
1696 | } |
1736 | *type = CFAPI_INT; |
1697 | *type = CFAPI_INT; |
1737 | break; |
1698 | break; |
1738 | |
1699 | |
… | |
… | |
2310 | break; |
2271 | break; |
2311 | |
2272 | |
2312 | case CFAPI_OBJECT_PROP_OWNER: |
2273 | case CFAPI_OBJECT_PROP_OWNER: |
2313 | oparg = va_arg (args, object *); |
2274 | oparg = va_arg (args, object *); |
2314 | |
2275 | |
2315 | set_owner (op, oparg); |
2276 | op->set_owner (oparg); |
2316 | break; |
2277 | break; |
2317 | |
2278 | |
2318 | case CFAPI_OBJECT_PROP_CHEATER: |
2279 | case CFAPI_OBJECT_PROP_CHEATER: |
2319 | set_cheat (op); |
2280 | set_cheat (op); |
2320 | break; |
2281 | break; |
… | |
… | |
2455 | if (op->contr) |
2416 | if (op->contr) |
2456 | { |
2417 | { |
2457 | oparg = va_arg (args, object *); |
2418 | oparg = va_arg (args, object *); |
2458 | |
2419 | |
2459 | op->contr->mark = oparg; |
2420 | op->contr->mark = oparg; |
2460 | if (oparg) |
|
|
2461 | op->contr->mark_count = oparg->count; |
|
|
2462 | } |
2421 | } |
2463 | break; |
2422 | break; |
2464 | |
2423 | |
2465 | case CFAPI_PLAYER_PROP_PARTY: |
2424 | case CFAPI_PLAYER_PROP_PARTY: |
2466 | if (op->contr) |
2425 | if (op->contr) |
… | |
… | |
2645 | op = va_arg (args, object *); |
2604 | op = va_arg (args, object *); |
2646 | |
2605 | |
2647 | va_end (args); |
2606 | va_end (args); |
2648 | |
2607 | |
2649 | send_removed_object (op); |
2608 | send_removed_object (op); |
2650 | remove_ob (op); |
2609 | op->remove (); |
2651 | *type = CFAPI_NONE; |
2610 | *type = CFAPI_NONE; |
2652 | return NULL; |
2611 | return NULL; |
2653 | } |
2612 | } |
2654 | |
2613 | |
2655 | void * |
2614 | void * |
… | |
… | |
2662 | |
2621 | |
2663 | op = va_arg (args, object *); |
2622 | op = va_arg (args, object *); |
2664 | |
2623 | |
2665 | va_end (args); |
2624 | va_end (args); |
2666 | |
2625 | |
2667 | free_object (op); |
2626 | op->destroy (); |
2668 | |
2627 | |
2669 | *type = CFAPI_NONE; |
2628 | *type = CFAPI_NONE; |
2670 | return NULL; |
2629 | return NULL; |
2671 | } |
2630 | } |
2672 | |
2631 | |
… | |
… | |
2689 | *type = CFAPI_POBJECT; |
2648 | *type = CFAPI_POBJECT; |
2690 | return object_create_clone (op); |
2649 | return object_create_clone (op); |
2691 | } |
2650 | } |
2692 | else |
2651 | else |
2693 | { |
2652 | { |
2694 | object *tmp; |
2653 | object *tmp = op->clone (); |
2695 | |
|
|
2696 | tmp = get_object (); |
|
|
2697 | copy_object (op, tmp); |
|
|
2698 | *type = CFAPI_POBJECT; |
2654 | *type = CFAPI_POBJECT; |
2699 | return tmp; |
2655 | return tmp; |
2700 | } |
2656 | } |
2701 | } |
2657 | } |
2702 | void * |
2658 | void * |
… | |
… | |
2766 | *type = CFAPI_POBJECT; |
2722 | *type = CFAPI_POBJECT; |
2767 | switch (ival) |
2723 | switch (ival) |
2768 | { |
2724 | { |
2769 | case 0: |
2725 | case 0: |
2770 | va_end (args); |
2726 | va_end (args); |
2771 | return get_object (); |
2727 | return object::create (); |
2772 | break; |
2728 | break; |
2773 | |
2729 | |
2774 | case 1: /* Named object. Nearly the old plugin behavior, but we don't add artifact suffixes */ |
2730 | case 1: /* Named object. Nearly the old plugin behavior, but we don't add artifact suffixes */ |
2775 | { |
2731 | { |
2776 | char *sval; |
2732 | char *sval; |
… | |
… | |
2779 | |
2735 | |
2780 | op = get_archetype_by_object_name (sval); |
2736 | op = get_archetype_by_object_name (sval); |
2781 | |
2737 | |
2782 | if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) |
2738 | if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) |
2783 | { |
2739 | { |
2784 | free_object (op); |
2740 | op->destroy (); |
2785 | /* Try with archetype names... */ |
2741 | /* Try with archetype names... */ |
2786 | op = get_archetype (sval); |
2742 | op = get_archetype (sval); |
2787 | if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) |
2743 | if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) |
2788 | { |
2744 | { |
2789 | free_object (op); |
2745 | op->destroy (); |
2790 | *type = CFAPI_NONE; |
2746 | *type = CFAPI_NONE; |
2791 | va_end (args); |
2747 | va_end (args); |
2792 | return NULL; |
2748 | return NULL; |
2793 | } |
2749 | } |
2794 | } |
2750 | } |
… | |
… | |
2953 | |
2909 | |
2954 | op = va_arg (args, object *); |
2910 | op = va_arg (args, object *); |
2955 | |
2911 | |
2956 | va_end (args); |
2912 | va_end (args); |
2957 | |
2913 | |
2958 | clear_object (op); |
2914 | op->clear (); |
2959 | *type = CFAPI_NONE; |
2915 | *type = CFAPI_NONE; |
2960 | return NULL; |
2916 | return NULL; |
2961 | } |
2917 | } |
2962 | |
2918 | |
2963 | void * |
2919 | void * |
… | |
… | |
3263 | x = map->enter_x; |
3219 | x = map->enter_x; |
3264 | y = map->enter_y; |
3220 | y = map->enter_y; |
3265 | } |
3221 | } |
3266 | |
3222 | |
3267 | /* |
3223 | /* |
3268 | originator = get_object(); |
3224 | originator = object::create(); |
3269 | EXIT_PATH(originator) = add_string(map->path); |
3225 | EXIT_PATH(originator) = add_string(map->path); |
3270 | EXIT_X(originator) = x; |
3226 | EXIT_X(originator) = x; |
3271 | EXIT_Y(originator) = y; |
3227 | EXIT_Y(originator) = y; |
3272 | printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/ |
3228 | printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/ |
3273 | /*enter_exit(op, originator); */ |
3229 | /*enter_exit(op, originator); */ |
3274 | insert_ob_in_map_at (op, map, NULL, 0, x, y); |
3230 | insert_ob_in_map_at (op, map, NULL, 0, x, y); |
3275 | /*printf("A Transfer: X=%d, Y=%d, MAP=%s\n", x, y, op->map->name); |
3231 | /*printf("A Transfer: X=%d, Y=%d, MAP=%s\n", x, y, op->map->name); |
3276 | free_object(originator); |
3232 | originator->destroy (); |
3277 | */ |
3233 | */ |
3278 | *type = CFAPI_INT; |
3234 | *type = CFAPI_INT; |
3279 | return &rv; |
3235 | return &rv; |
3280 | break; |
3236 | break; |
3281 | |
3237 | |
… | |
… | |
3470 | result = 1; |
3426 | result = 1; |
3471 | return &result; |
3427 | return &result; |
3472 | } |
3428 | } |
3473 | |
3429 | |
3474 | send_removed_object (who); |
3430 | send_removed_object (who); |
3475 | remove_ob (who); |
3431 | who->remove (); |
3476 | |
3432 | |
3477 | for (tmp = who; tmp != NULL; tmp = tmp->more) |
3433 | for (tmp = who; tmp != NULL; tmp = tmp->more) |
3478 | tmp->x = x + freearr_x[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.x), |
3434 | tmp->x = x + freearr_x[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.x), |
3479 | tmp->y = y + freearr_y[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.y); |
3435 | tmp->y = y + freearr_y[k] + (tmp->arch == NULL ? 0 : tmp->arch->clone.y); |
3480 | |
3436 | |