most of the work to get the waypoint editor working. not quite there yet,

though
This commit is contained in:
Bill Currie 2006-12-16 14:42:55 +00:00
parent 466184e103
commit c115d935c5
10 changed files with 1219 additions and 10 deletions

View file

@ -18,6 +18,8 @@ libfrikbot_source = \
map_dm5.qc \
map_dm6.qc \
chat.r \
editor.r \
impulse_menu.r \
target.r \
waypoint.r

View file

@ -136,6 +136,11 @@ is gone too.
[self setSearchTime:time + 5];
}
-(void)targetClearAll
{
targets[0] = targets[1] = targets[2] = targets[3] = NIL;
}
/*
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

View file

@ -402,7 +402,8 @@ bot_menu_display =
if (self.current_way.b_aiflags & AI_DIFFICULT)
self.current_way.b_aiflags &= ~AI_DIFFICULT;
else
self.current_way.b_aiflags |= AI_DIFFICULT; self.b_menu_time = time;
self.current_way.b_aiflags |= AI_DIFFICULT;
self.b_menu_time = time;
} else if (self.impulse == 2) {
if (self.current_way.b_aiflags & AI_PLAT_BOTTOM)
self.current_way.b_aiflags &= ~AI_PLAT_BOTTOM;

View file

@ -262,7 +262,7 @@ ClientNumber =
return f;
};
void (integer whatbot, integer whatskill)
Bot (integer whatbot, integer whatskill)
BotConnect =
{
local entity cl;
@ -272,7 +272,7 @@ BotConnect =
cl = SV_AllocClient ();
if (!cl) {
bprint (PRINT_HIGH, "Unable to connect a bot, server is full.\n");
return;
return NIL;
}
if (whatbot)
@ -282,6 +282,7 @@ BotConnect =
bot = [[Bot alloc] initWithEntity: cl named:name skill:whatskill];
[bot startTopic:1];
return bot;
};
/*
@ -471,6 +472,7 @@ void(Waypoint e1, Waypoint e2, integer flag) DeveloperLightning = {};
bot_count--;
SV_FreeClient (ent);
[bot_array removeItem:self];
}
-(void)frame

887
fbxa/editor.r Normal file
View file

@ -0,0 +1,887 @@
#include "impulse_menu.h"
#include "libfrikbot.h"
#include "string.h"
#include "PropertyList.h"
#include "qfile.h"
@interface EditorState: Object
{
ImpulseMenu menu;
ImpulseMenu prev_menu;
string confirm_text;
string confirm_cmd;
Waypoint current_way;
Waypoint last_way;
integer hold_select;
Bot test_bot;
integer edit_mode;
}
+main_menu;
+waypoint_menu;
+link_menu;
+ai_flags_menu;
+ai_flag2_menu;
+bot_menu;
+waylist_menu;
+teleport_to_way;
+close_menu;
+move_waypoint;
+delete_waypoint;
+make_waypoint;
+make_waypoint_link;
+make_way_link_x2;
+make_way_telelink;
+show_waypoint_info;
+unlink_waypoint;
+create_link;
+create_telelink;
+delete_link;
+create_link_x2;
+delete_link_x2;
+add_test_bot;
+call_test_bot;
+remove_test_bot;
+stop_test_bot;
+teleport_bot;
+delete_all_waypoints;
+dump_waypoints;
+check_for_errors;
+save_waypoints;
+confirm;
+cancel;
+(integer)getHoldSelectState;
+(void)toggleHoldSelectState;
+(string)getConfirmText;
+(Waypoint)current_way;
@end
@interface TeleportMenu: ImpulseValueMenu
@end
@interface NoclipFlag: Object <FlagMenuItem>
@end
@interface GodmodeFlag: Object <FlagMenuItem>
@end
@interface HoldSelectFlag: Object <FlagMenuItem>
@end
@interface DynamicFlag: Object <FlagMenuItem>
@end
@interface DynamicLinkFlag: Object <FlagMenuItem>
@end
@interface ConfirmationMenu: ImpulseListMenu
@end
@interface FlagCluster: Object <FlagMenuItem>
{
integer mask;
}
- initWithMask:(integer)msk;
@end
@implementation TeleportMenu: ImpulseValueMenu
-(id) init
{
return [super initWithText:"-- Teleport to Way # --\n\n"
"Enter way number and press\n"
"impulse 104 to warp\n\n"
"Waypoint #"];
}
-(integer) impulse:(integer)imp
{
local Waypoint way = NIL;
if ((imp = [super impulse:imp]) == 104) {
imp = 0;
if (value)
way = (Waypoint) [waypoint_array getItemAt:value - 1];
value = 0;
if (way)
setorigin (@self, way.origin - @self.view_ofs);
else
sprint (@self, PRINT_HIGH, "No waypoint with that number\n");
[EditorState main_menu];
}
return imp;
}
@end
@implementation NoclipFlag
-(integer) getState
{
return @self.movetype == MOVETYPE_NOCLIP;
}
-(void) toggleState
{
if (@self.movetype == MOVETYPE_NOCLIP)
@self.movetype = MOVETYPE_WALK;
else
@self.movetype = MOVETYPE_NOCLIP;
}
@end
@implementation GodmodeFlag
-(integer) getState
{
return !!(@self.flags & FL_GODMODE);
}
-(void) toggleState
{
@self.flags ^= FL_GODMODE;
}
@end
@implementation HoldSelectFlag
-(integer) getState
{
return [EditorState getHoldSelectState];
}
-(void) toggleState
{
[EditorState toggleHoldSelect];
}
@end
@implementation DynamicFlag
-(integer) getState
{
return waypoint_mode == WM_EDITOR_DYNAMIC;
}
-(void) toggleState
{
if (waypoint_mode == WM_EDITOR_DYNAMIC)
waypoint_mode = WM_EDITOR;
else
waypoint_mode = WM_EDITOR_DYNAMIC;
}
@end
@implementation DynamicLinkFlag
-(integer) getState
{
local integer mode = waypoint_mode;
return mode == WM_EDITOR_DYNAMIC || mode == WM_EDITOR_DYNLINK;
}
-(void) toggleState
{
if (waypoint_mode == WM_EDITOR_DYNLINK)
waypoint_mode = WM_EDITOR;
else
waypoint_mode = WM_EDITOR_DYNLINK;
}
@end
@implementation FlagCluster
-(id) initWithMask:(integer)msk
{
self = [super init];
mask = msk;
}
-(integer) getState
{
local Waypoint way = [EditorState current_way];
if (!way)
return 0;
return !!(way.flags & mask);
}
-(void) toggleState
{
local Waypoint way = [EditorState current_way];
if (way)
way.flags ^= mask;
}
@end
@implementation ConfirmationMenu
-(string) text
{
text = [EditorState getConfirmText];
return [super text];
}
@end
@static ImpulseListMenu main_menu;
@static ImpulseListMenu waypoint_menu;
@static ImpulseListMenu link_menu;
@static ImpulseListMenu ai_flags_menu;
@static ImpulseListMenu ai_flag2_menu;
@static ImpulseListMenu bot_menu;
@static ImpulseListMenu waylist_menu;
@static ConfirmationMenu confirm_menu;
@static void init_menus (void)
{
main_menu = [[ImpulseListMenu alloc]
initWithText:"-- Main Menu --"];
waypoint_menu = [[ImpulseListMenu alloc]
initWithText:"-- Waypoint Management --"];
link_menu = [[ImpulseListMenu alloc]
initWithText:"-- Link Management --"];
ai_flags_menu = [[ImpulseListMenu alloc]
initWithText:"-- AI Flag Management Menu --"];
ai_flag2_menu = [[ImpulseListMenu alloc]
initWithText:"-- AI Flag pg. 2 --"];
bot_menu = [[ImpulseListMenu alloc]
initWithText:"-- Bot Management Menu --"];
waylist_menu = [[ImpulseListMenu alloc]
initWithText:"-- Waylist Management --"];
confirm_menu = [[ConfirmationMenu alloc] init];
[main_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Waypoint Management"
object:[EditorState class]
selector:@selector(waypoint_menu)]];
[main_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Link Management"
object:[EditorState class]
selector:@selector(link_menu)]];
[main_menu addItem:[[CommandMenuItem alloc]
initWithText:">>AI Flag Management"
object:[EditorState class]
selector:@selector(ai_flag_menu)]];
[main_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Bot Management"
object:[EditorState class]
selector:@selector(bot_menu)]];
[main_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Waylist Management"
object:[EditorState class]
selector:@selector(waylist_menu)]];
[main_menu addItem:[[FlagMenuItem alloc]
initWithText:"Noclip"
flag:[[NoclipFlag alloc] init]]];
[main_menu addItem:[[FlagMenuItem alloc]
initWithText:"Godmode"
flag:[[GodmodeFlag alloc] init]]];
[main_menu addItem:[[FlagMenuItem alloc]
initWithText:"Hold Select"
flag:[[HoldSelectFlag alloc] init]]];
[main_menu addItem:[[CommandMenuItem alloc]
initWithText:"Teleport to Way #"
object:[EditorState class]
selector:@selector(teleport_to_way)]];
[main_menu addItem:[[CommandMenuItem alloc]
initWithText:"Close Menu"
object:[EditorState class]
selector:@selector(close_menu)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:"Move Waypoint"
object:[EditorState class]
selector:@selector(move_waypoint)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:"Delete Waypoint"
object:[EditorState class]
selector:@selector(delete_waypoint)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:"Make Waypoint"
object:[EditorState class]
selector:@selector(make_waypoint)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:"Make Waypoint + Link"
object:[EditorState class]
selector:@selector(make_waypoint_link)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:"Make Way + Link X2"
object:[EditorState class]
selector:@selector(make_way_link_x2)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:"Make Way + Telelink"
object:[EditorState class]
selector:@selector(make_way_telelink)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:"Show waypoint info"
object:[EditorState class]
selector:@selector(show_waypoint_info)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Link Management"
object:[EditorState class]
selector:@selector(link_menu)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:">>AI Flag Management"
object:[EditorState class]
selector:@selector(ai_flag_menu)]];
[waypoint_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Main Menu"
object:[EditorState class]
selector:@selector(main_menu)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:"Unlink Waypoint"
object:[EditorState class]
selector:@selector(unlink_waypoint)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:"Create Link"
object:[EditorState class]
selector:@selector(create_link)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:"Create Telelink"
object:[EditorState class]
selector:@selector(create_telelink)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:"Delete Link"
object:[EditorState class]
selector:@selector(delete_link)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:"Create Link X2"
object:[EditorState class]
selector:@selector(create_link_x2)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:"Delete Link X2"
object:[EditorState class]
selector:@selector(delete_link_x2)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:"Make Waypoint"
object:[EditorState class]
selector:@selector(make_waypoint)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Waypoint Management"
object:[EditorState class]
selector:@selector(waypoint_menu)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:">>AI Flag Management"
object:[EditorState class]
selector:@selector(ai_flag_menu)]];
[link_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Main Menu"
object:[EditorState class]
selector:@selector(main_menu)]];
[ai_flags_menu addItem:[[FlagMenuItem alloc]
initWithText:"Door Flag"
flag:[[FlagCluster alloc]
initWithMask:AI_DOORFLAG]]];
[ai_flags_menu addItem:[[FlagMenuItem alloc]
initWithText:"Precision"
flag:[[FlagCluster alloc]
initWithMask:AI_PRECISION]]];
[ai_flags_menu addItem:[[FlagMenuItem alloc]
initWithText:"Surface for Air"
flag:[[FlagCluster alloc]
initWithMask:AI_SURFACE]]];
[ai_flags_menu addItem:[[FlagMenuItem alloc]
initWithText:"Blind mode"
flag:[[FlagCluster alloc]
initWithMask:AI_BLIND]]];
[ai_flags_menu addItem:[[FlagMenuItem alloc]
initWithText:"Jump"
flag:[[FlagCluster alloc]
initWithMask:AI_JUMP]]];
[ai_flags_menu addItem:[[FlagMenuItem alloc]
initWithText:"Directional"
flag:[[FlagCluster alloc]
initWithMask:AI_DIRECTIONAL]]];
[ai_flags_menu addItem:[[FlagMenuItem alloc]
initWithText:"Super Jump"
flag:[[FlagCluster alloc]
initWithMask:AI_SUPER_JUMP]]];
[ai_flags_menu addItem:[[MenuItem alloc] initWithText:""]];
[ai_flags_menu addItem:[[CommandMenuItem alloc]
initWithText:">>AI Flags page 2"
object:[EditorState class]
selector:@selector(ai_flag2_menu)]];
[ai_flags_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Main Menu"
object:[EditorState class]
selector:@selector(main_menu)]];
[ai_flag2_menu addItem:[[FlagMenuItem alloc]
initWithText:"Difficult"
flag:[[FlagCluster alloc]
initWithMask:AI_DIFFICULT]]];
[ai_flag2_menu addItem:[[FlagMenuItem alloc]
initWithText:"Wait for plat"
flag:[[FlagCluster alloc]
initWithMask:AI_PLAT_BOTTOM]]];
[ai_flag2_menu addItem:[[FlagMenuItem alloc]
initWithText:"Ride train"
flag:[[FlagCluster alloc]
initWithMask:AI_RIDE_TRAIN]]];
[ai_flag2_menu addItem:[[FlagMenuItem alloc]
initWithText:"Door flag no open"
flag:[[FlagCluster alloc]
initWithMask:AI_DOOR_NO_OPEN]]];
[ai_flag2_menu addItem:[[FlagMenuItem alloc]
initWithText:"Ambush"
flag:[[FlagCluster alloc]
initWithMask:AI_AMBUSH]]];
[ai_flag2_menu addItem:[[FlagMenuItem alloc]
initWithText:"Snipe"
flag:[[FlagCluster alloc]
initWithMask:AI_SNIPER]]];
[ai_flag2_menu addItem:[[FlagMenuItem alloc]
initWithText:"Trace Test"
flag:[[FlagCluster alloc]
initWithMask:AI_TRACE_TEST]]];
[ai_flag2_menu addItem:[[MenuItem alloc] initWithText:""]];
[ai_flag2_menu addItem:[[CommandMenuItem alloc]
initWithText:">>AI Flags page 2"
object:[EditorState class]
selector:@selector(ai_flag2_menu)]];
[ai_flag2_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Main Menu"
object:[EditorState class]
selector:@selector(main_menu)]];
[bot_menu addItem:[[CommandMenuItem alloc]
initWithText:"Add a Test Bot"
object:[EditorState class]
selector:@selector(add_test_bot)]];
[bot_menu addItem:[[CommandMenuItem alloc]
initWithText:"Order Test Bot here"
object:[EditorState class]
selector:@selector(call_test_bot)]];
[bot_menu addItem:[[CommandMenuItem alloc]
initWithText:"Remove Test Bot"
object:[EditorState class]
selector:@selector(remove_test_bot)]];
[bot_menu addItem:[[CommandMenuItem alloc]
initWithText:"Stop Test Bot"
object:[EditorState class]
selector:@selector(stop_test_bot)]];
[bot_menu addItem:[[CommandMenuItem alloc]
initWithText:"Teleport Bot here"
object:[EditorState class]
selector:@selector(teleport_bot)]];
[bot_menu addItem:[[CommandMenuItem alloc]
initWithText:"Teleport to Way #"
object:[EditorState class]
selector:@selector(teleport_to_way)]];
[bot_menu addItem:[[MenuItem alloc] initWithText:""]];
[bot_menu addItem:[[MenuItem alloc] initWithText:""]];
[bot_menu addItem:[[MenuItem alloc] initWithText:""]];
[bot_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Main Menu"
object:[EditorState class]
selector:@selector(main_menu)]];
[waylist_menu addItem:[[CommandMenuItem alloc]
initWithText:"Delete ALL Waypoints"
object:[EditorState class]
selector:@selector(delete_all_waypoints)]];
[waylist_menu addItem:[[CommandMenuItem alloc]
initWithText:"Dump Waypoints"
object:[EditorState class]
selector:@selector(dump_waypoints)]];
[waylist_menu addItem:[[CommandMenuItem alloc]
initWithText:"Check For Errors"
object:[EditorState class]
selector:@selector(check_for_errors)]];
[waylist_menu addItem:[[CommandMenuItem alloc]
initWithText:"Save Waypoints"
object:[EditorState class]
selector:@selector(save_waypoints)]];
[main_menu addItem:[[FlagMenuItem alloc]
initWithText:"Dynamic Mode"
flag:[[DynamicFlag alloc] init]]];
[main_menu addItem:[[FlagMenuItem alloc]
initWithText:"Dynamic Link"
flag:[[DynamicLinkFlag alloc] init]]];
[waylist_menu addItem:[[MenuItem alloc] initWithText:""]];
[waylist_menu addItem:[[MenuItem alloc] initWithText:""]];
[waylist_menu addItem:[[MenuItem alloc] initWithText:""]];
[waylist_menu addItem:[[CommandMenuItem alloc]
initWithText:">>Main Menu"
object:[EditorState class]
selector:@selector(main_menu)]];
[confirm_menu addItem:[[CommandMenuItem alloc]
initWithText:"OK"
object:[EditorState class]
selector:@selector(confirm)]];
[confirm_menu addItem:[[CommandMenuItem alloc]
initWithText:"Cancel"
object:[EditorState class]
selector:@selector(cancel)]];
}
@implementation EditorState: Object
+main_menu
{
((Target) @self.@this).editor.menu = main_menu;
}
+waypoint_menu
{
((Target) @self.@this).editor.menu = waypoint_menu;
}
+link_menu
{
((Target) @self.@this).editor.menu = link_menu;
}
+ai_flags_menu
{
((Target) @self.@this).editor.menu = ai_flags_menu;
}
+ai_flag2_menu
{
((Target) @self.@this).editor.menu = ai_flag2_menu;
}
+bot_menu
{
((Target) @self.@this).editor.menu = bot_menu;
}
+waylist_menu
{
((Target) @self.@this).editor.menu = waylist_menu;
}
+teleport_to_way
{
}
+close_menu
{
((Target) @self.@this).editor.menu = NIL;
}
+move_waypoint
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way)
[way setOrigin: @self.origin + @self.view_ofs];
}
+delete_waypoint
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way) {
editor.prev_menu = editor.menu;
editor.confirm_text = "-- Delete Waypoint --\n\nAre you sure?";
editor.confirm_cmd = "delete waypoitn";
editor.menu = confirm_menu;
editor.last_way = way;
}
}
+make_waypoint
{
[[Waypoint alloc] initAt: @self.origin + @self.view_ofs];
}
+make_waypoint_link
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
local Waypoint new = [[Waypoint alloc]
initAt: @self.origin + @self.view_ofs];
if (!way || ![way linkWay: new])
sprint (@self, PRINT_HIGH, "Unable to link them\n");
}
+make_way_link_x2
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
local Waypoint new = [[Waypoint alloc]
initAt: @self.origin + @self.view_ofs];
if (!way || ![way linkWay: new])
sprint (@self, PRINT_HIGH, "Unable to link old to new\n");
if (!way || ![new linkWay: way])
sprint (@self, PRINT_HIGH, "Unable to link new to old\n");
}
+make_way_telelink
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
local Waypoint new = [[Waypoint alloc]
initAt: @self.origin + @self.view_ofs];
if (!way || ![way teleLinkWay: new])
sprint (@self, PRINT_HIGH, "Unable to link them\n");
}
+show_waypoint_info
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
local integer i;
if (!way)
return self;
sprint (@self, PRINT_HIGH,
sprintf ("\nwaypoint info for waypoint #%i", [way id]));
sprint (@self, PRINT_HIGH,
sprintf ("\nAI Flag value: %#x", [way id]));
for (i = 0; i < 4; i++) {
if (!way.links[i])
continue;
sprint (@self, PRINT_HIGH,
sprintf ("\n%s%d to: %i",
way.flags & (AI_TELELINK_1 << i) ? "Telelink" : "Link",
i + 1, [way.links[i] id]));
}
sprint (@self, PRINT_HIGH, "\n\n");
}
+unlink_waypoint
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way)
[way clearLinks];
}
+create_link
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way) {
editor.prev_menu = editor.menu;
editor.confirm_text = "-- Link Ways --\n\nSelect another way";
editor.confirm_cmd = "link ways";
editor.menu = confirm_menu;
editor.last_way = way;
}
}
+create_telelink
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way) {
editor.prev_menu = editor.menu;
editor.confirm_text = "-- Telelink Ways --\n\nSelect another way";
editor.confirm_cmd = "telelink ways";
editor.menu = confirm_menu;
editor.last_way = way;
}
}
+delete_link
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way) {
editor.prev_menu = editor.menu;
editor.confirm_text = "-- Delete Link --\n\nSelect another way";
editor.confirm_cmd = "delete link";
editor.menu = confirm_menu;
editor.last_way = way;
}
}
+create_link_x2
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way) {
editor.prev_menu = editor.menu;
editor.confirm_text = "-- Create Link X2 --\n\nSelect another way";
editor.confirm_cmd = "create link x2";
editor.menu = confirm_menu;
editor.last_way = way;
}
}
+delete_link_x2
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way) {
editor.prev_menu = editor.menu;
editor.confirm_text = "-- Delete Link X2 --\n\nSelect another way";
editor.confirm_cmd = "delete link x2";
editor.menu = confirm_menu;
editor.last_way = way;
}
}
+add_test_bot
{
local EditorState editor = ((Target) @self.@this).editor;
local integer f;
local string h;
if (editor.test_bot) {
sprint (@self, PRINT_HIGH, "already have test bot\n");
return self;
}
h = infokey (NIL, "skill");
f = (integer) stof (h);
editor.test_bot = BotConnect (0, f);
}
+call_test_bot
{
local EditorState editor = ((Target) @self.@this).editor;
if (editor.test_bot)
[editor.test_bot getPath:[Target forEntity:@self], TRUE];
}
+remove_test_bot
{
local EditorState editor = ((Target) @self.@this).editor;
if (editor.test_bot)
[editor.test_bot disconnect];
}
+stop_test_bot
{
local EditorState editor = ((Target) @self.@this).editor;
if (editor.test_bot) {
[editor.test_bot targetClearAll];
route_table = NIL;
}
}
+teleport_bot
{
local EditorState editor = ((Target) @self.@this).editor;
local Waypoint way = [editor current_way];
if (way && editor.test_bot)
setorigin (editor.test_bot.ent, [way origin]);
if (!way)
sprint(@self, PRINT_HIGH, "select a waypoint first\n");
}
+delete_all_waypoints
{
local EditorState editor = ((Target) @self.@this).editor;
editor.prev_menu = editor.menu;
editor.confirm_text = "-- Delete ALL Ways --\n\nAre you sure?";
editor.confirm_cmd = "delete all ways";
editor.menu = confirm_menu;
}
+dump_waypoints
{
local PLItem plist = [Waypoint plist];
bprint (PRINT_HIGH, [plist write]);
bprint (PRINT_HIGH, "\n");
[plist release];
}
+check_for_errors
{
[Waypoint check:[Target forEntity:@self]];
}
+save_waypoints
{
local QFile file;
local PLItem plist;
file = Qopen ("temp.way", "wt");
if (!file) {
sprint (@self, PRINT_HIGH, "cound not create file temp.way\n");
return self;
}
plist = [Waypoint plist];
Qputs (file, [plist write]);
[plist release];
Qclose (file);
sprint (@self, PRINT_HIGH, "waypoints saved to temp.way\n");
}
+confirm
{
local EditorState editor = ((Target) @self.@this).editor;
switch (editor.confirm_cmd) {
case "link ways":
if (editor.current_way) {
if (![editor.last_way linkWay:editor.current_way])
sprint (@self, PRINT_HIGH, "Unable to link them\n");
}
break;
case "telelink ways":
if (editor.current_way) {
if (![editor.last_way teleLinkWay:editor.current_way])
sprint (@self, PRINT_HIGH, "Unable to link them\n");
}
break;
case "delete link":
if (editor.current_way) {
[editor.last_way unlinkWay:editor.current_way];
}
break;
case "create link x2":
if (editor.current_way) {
if (![editor.last_way teleLinkWay:editor.current_way])
sprint (@self, PRINT_HIGH, "Unable to link 1 to 2\n");
if (![editor.current_way teleLinkWay:editor.last_way])
sprint (@self, PRINT_HIGH, "Unable to link 2 to 1\n");
}
break;
case "delete link x2":
if (editor.current_way) {
[editor.last_way unlinkWay:editor.current_way];
[editor.current_way unlinkWay:editor.last_way];
}
break;
case "delete all ways":
[Waypoint clearAll];
editor.current_way = editor.last_way = NIL;
break;
case "delete waypoint":
[waypoint_array removeItem:editor.last_way];
if (editor.current_way == editor.last_way)
editor.current_way = NIL;
editor.last_way = NIL;
break;
}
editor.menu = editor.prev_menu;
}
+cancel
{
local EditorState editor = ((Target) @self.@this).editor;
editor.menu = editor.prev_menu;
}
+(integer)getHoldSelectState
{
local EditorState editor = ((Target) @self.@this).editor;
return editor.hold_select != 0;
}
+(void)toggleHoldSelectState
{
local EditorState editor = ((Target) @self.@this).editor;
editor.hold_select = !editor.hold_select;
}
+(string)getConfirmText
{
local EditorState editor = ((Target) @self.@this).editor;
return editor.confirm_text;
}
+(Waypoint)current_way
{
local EditorState editor = ((Target) @self.@this).editor;
return editor.current_way;
}
@end

57
fbxa/impulse_menu.h Normal file
View file

@ -0,0 +1,57 @@
#ifndef __impulse_menu_h
#define __impulse_menu_h
#include "Object.h"
@interface MenuItem: Object
{
string text;
}
- (id) initWithText:(string)txt;
- (string) text;
- (void) select;
@end
@protocol FlagMenuItem
-(integer) getState;
-(void) toggleState;
@end
@interface FlagMenuItem: MenuItem
{
id flag;
}
- (id) initWithText:(string)txt flagObject:(id)flg;
@end
@interface CommandMenuItem: MenuItem
{
id object;
SEL selector;
}
- (id) initWithText:(string)txt object:(id)obj selector:(SEL)sel;
@end
@interface ImpulseMenu: Object
{
string text;
}
- (id) initWithText:(string)txt;
- (integer) impulse:(integer)imp;
- (string) text;
@end
@interface ImpulseValueMenu: ImpulseMenu
{
integer value;
}
@end
@interface ImpulseListMenu: ImpulseMenu
{
MenuItem [10]items;
}
- (void) addItem:(MenuItem)item;
@end
#endif//__impulse_menu_h

140
fbxa/impulse_menu.r Normal file
View file

@ -0,0 +1,140 @@
#include "impulse_menu.h"
#include "string.h"
@implementation MenuItem
- (id) initWithText:(string)txt
{
self = [super init];
text = txt;
return self;
}
- (string) text
{
return text;
}
- (void) select
{
}
@end
@implementation FlagMenuItem
- (id) initWithText:(string)txt flagObject:(id)flg
{
self = [super initWithText: txt];
flag = flg;
}
- (string) text
{
local integer state = (integer)[flag getState];
return sprintf ("[%c] %s", state ? '#' : ' ', [super text]);
}
- (void) select
{
[flag toggleState];
}
@end
@implementation CommandMenuItem
- (id) initWithText:(string)txt object:(id)obj selector:(SEL)sel
{
self = [super initWithText: txt];
object = obj;
selector = sel;
}
- (void) select
{
[object performSelector:selector];
}
@end
@implementation ImpulseMenu
- (id) initWithText:(string)txt
{
self = [super init];
text = txt;
return self;
}
- (integer) impulse: (integer) imp
{
return imp;
}
- (string) text
{
return sprintf ("%s", text);
}
@end
@implementation ImpulseValueMenu
- (integer) impulse: (integer) imp
{
if (imp < 1 || imp > 10)
return imp;
if (imp == 10)
imp = 0;
value = value * 10 + imp;
return 0;
}
- (string) text
{
return sprintf ("%s%i", text, value);
}
- (void) clearValue
{
value = 0;
}
- (integer) value
{
return value;
}
@end
@implementation ImpulseListMenu
- (integer) impulse: (integer) imp
{
if (imp < 1 || imp > 10)
return imp;
if (items[imp - 1])
[items[imp - 1] select];
return 0;
}
- (string) text
{
local string str = text;
local string s;
local integer i;
for (i = 0; i < 10; i++) {
if (!items[i])
break;
s = [items[i] text];
if (s)
str = sprintf ("%s\n[%i] %s", str, (i + 1) % 10, s);
else
str = sprintf ("%s\n", str);
}
return str;
}
- (void) addItem:(MenuItem) item
{
local integer i;
for (i = 0; i < 10; i++) {
if (!items[i]) {
items[i] = item;
break;
}
}
}
@end

View file

@ -1,7 +1,10 @@
#include "Entity.h"
@class PLItem;
@class Bot;
@class Waypoint;
@class EditorState;
struct bot_data_t = {
string name;
@ -13,7 +16,9 @@ typedef struct bot_data_t bot_data_t;
{
@public
Waypoint current_way;
integer hold_select;
Target _last;
EditorState editor;
}
+(Target)forEntity:(entity)e;
-(vector)realorigin;
@ -49,12 +54,19 @@ typedef struct bot_data_t bot_data_t;
+(void)clearAll;
+(Waypoint)waypointForNum:(integer)num;
+(void)fixWaypoints;
+(PLItem)plist;
+(void)check:(Target)ent;
+(void)clearRouteTable;
+(void)clearMyRoute:(Bot) bot;
+(Waypoint)find:(vector)org radius:(float)rad;
-(void)fix;
+(void)showAll;
+(void)hideAll;
-(void)deselect;
-(void)select;
-(integer)id;
-(id)init;
-(id)initAt:(vector)org;
-(id)initFromEntity:(entity)ent;
@ -67,6 +79,7 @@ typedef struct bot_data_t bot_data_t;
-(void)followLink:(Waypoint)e2 :(integer)bBit;
-(void)waypointThink;
-(void)clearLinks;
-(void)clearRoute;
-(void)clearRouteForBot:(Bot)bot;
@ -101,9 +114,6 @@ typedef struct bot_data_t bot_data_t;
integer b_num;
float b_chattime;
float b_entertime;
float b_menu;
float b_menu_time;
float b_menu_value;
integer route_failed;
integer dyn_flags;
integer dyn_plat;
@ -158,6 +168,7 @@ typedef struct bot_data_t bot_data_t;
-(integer)targetOnstack:(Target)scot;
-(void)targetAdd:(Target)e;
-(void)targetDrop:(Target)e;
-(void)targetClearAll;
-(void)lost:(Target)targ :(integer)success;
-(void)checkLost:(Target)targ;
-(void)handleAI;
@ -288,6 +299,7 @@ typedef struct bot_data_t bot_data_t;
// -------ProtoTypes------
// external, in main code
@extern Bot (integer whatbot, integer whatskill) BotConnect;
@extern void() ClientConnect;
@extern void() ClientDisconnect;
@extern void() SetNewParms;
@ -305,6 +317,7 @@ typedef struct bot_data_t bot_data_t;
@extern void () map_dm6;
// ai & misc
@extern Array bot_array;
@extern float(float y1, float y2) angcomp;
@extern float(entity ent, entity targ, vector targ_origin) sisible;
@extern vector(entity ent) realorigin;

View file

@ -88,8 +88,7 @@ struct target_s = {
if (t)
return t;
t = [[Target alloc] init];
t.ent = e;
t = [[Target alloc] initWithEntity:e];
Hash_AddElement (target_tab, t);
return t;
}

View file

@ -67,11 +67,16 @@ Array waypoint_array;
@implementation Waypoint
-(integer)id
{
return [waypoint_array findItem:self] + 1;
}
-(id)init
{
if (!waypoint_array)
waypoint_init ();
return [super init];
return [super initWithEntity:NIL];
}
-(id)initAt:(vector)org
@ -120,6 +125,11 @@ Array waypoint_array;
return origin;
}
-(void)clearLinks
{
links[0] = links[1] = links[2] = links[3] = NIL;
}
-(integer)isLinkedTo:(Waypoint)way
{
local integer i;
@ -309,6 +319,53 @@ Waypoint Loading from file
//[waypoint_array makeObjectsPerformSelector:@selector(debug)];
}
-(void)plitem:(PLItem)list
{
local PLItem way = [PLItem newDictionary];
local PLItem l = [PLItem newArray];
local integer i;
[way addKey:"origin" value:[PLItem newString:vtos (origin)]];
for (i = 0; i < 4; i++) {
if (links[i])
[l addObject:[PLItem newString:itos ([links[i] id])]];
else
[l addObject:[PLItem newString:"0"]];
}
[way addKey:"flags" value:[PLItem newString:itos (flags)]];
[list addObject:way];
}
+(PLItem) plist
{
local PLItem list = [PLItem newArray];
[waypoint_array makeObjectsPerformSelector:@selector(plitem)
withObject:list];
}
-(void) checkWay:(Target)ent
{
local integer i;
for (i = 0; i < 4; i++)
if (links[i])
break;
if (i == 4)
sprint (ent.ent, PRINT_HIGH,
sprintf ("Waypoitn %i has no outbount links\n", [self id]));
for (i = 0; i < 4; i++)
if (links[i] == self)
break;
if (i != 4)
sprint (ent.ent, PRINT_HIGH,
sprintf ("Waypoitn %i links to itself\n", [self id]));
}
+(void) check:(Target)ent
{
[waypoint_array makeObjectsPerformSelector:@selector(checkWay)
withObject:ent];
}
+(Waypoint)find:(vector)org radius:(float)rad
{
local vector dif;
@ -331,6 +388,52 @@ Waypoint Loading from file
return way;
}
-(void)show
{
if (!ent) {
ent = spawn ();
own = 1;
}
ent.classname = "waypoint";
ent.solid = SOLID_TRIGGER;
ent.movetype = MOVETYPE_NONE;
setsize (ent, VEC_HULL_MIN, VEC_HULL_MAX);
setorigin (ent, origin);
setmodel (ent, "progs/s_bubble.spr");
}
+(void)showAll
{
[waypoint_array makeObjectsPerformSelector:@selector (show)];
}
-(void)hide
{
if (ent) {
remove (ent);
own = 0;
}
}
+(void)hideAll
{
[waypoint_array makeObjectsPerformSelector:@selector (hide)];
}
-(void)select
{
if (!ent)
[self show];
setmodel (ent, "progs/s_light.spr");
}
-(void)deselect
{
if (!ent)
[self show];
setmodel (ent, "progs/s_bubble.spr");
}
/*
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=