From 0b403ba478a80af66e9505f2c807ad4d57e53a15 Mon Sep 17 00:00:00 2001
From: mcmlxxix <>
Date: Fri, 22 Oct 2010 22:49:42 +0000
Subject: [PATCH] cleaned up editor commands & display, added new mob creation,
 misc updates

---
 exec/ircbots/rpgbot/rpg_commands.js  | 88 ++++++++++++++++++----------
 exec/ircbots/rpgbot/rpg_functions.js | 62 ++++++++++++--------
 exec/ircbots/rpgbot/rpg_help.js      | 25 ++++----
 3 files changed, 108 insertions(+), 67 deletions(-)

diff --git a/exec/ircbots/rpgbot/rpg_commands.js b/exec/ircbots/rpgbot/rpg_commands.js
index 2ba9d73708..c7b499aca7 100644
--- a/exec/ircbots/rpgbot/rpg_commands.js
+++ b/exec/ircbots/rpgbot/rpg_commands.js
@@ -209,7 +209,7 @@ Bot_Commands["SAVE"].command = function (target,onick,ouh,srv,lvl,cmd) {
 		srv.o(target,"You are not logged in.");
 		return;	
 	}
-	if(player.@editing != 1) {
+	if(player.@editing == undefined) {
 		srv.o(target,"You must be editing to save.");
 		return;
 	}
@@ -226,6 +226,8 @@ Bot_Commands["SAVE"].command = function (target,onick,ouh,srv,lvl,cmd) {
 
 Bot_Commands["HELP"] = new Bot_Command(0,false,false);
 Bot_Commands["HELP"].command = function (target,onick,ouh,srv,lvl,cmd) {
+	log(cmd);
+	cmd.shift();
 	var topic=cmd.shift();
 	if(!topic) {
 		var cmd_str="";
@@ -271,7 +273,7 @@ Bot_Commands["RESTORE"].command = function (target,onick,ouh,srv,lvl,cmd) {
 		srv.o(target,"You are not logged in.");
 		return;	
 	}
-	if(player.@editing != 1) {
+	if(player.@editing == undefined) {
 		srv.o(target,"You must be editing to restore.");
 		return;
 	}
@@ -357,7 +359,8 @@ Editor_Commands["SET"] = function (srv,target,map,room,cmd,player) {
 		return;
 	}
 	
-	switch(player.@editing) {
+	var zone=zones[player.@zone];
+	switch(player.@editing.toString()) {
 	case "room":
 		edit_room_data(srv,target,zone,player,set,cmd);
 		break;
@@ -373,6 +376,9 @@ Editor_Commands["SET"] = function (srv,target,map,room,cmd,player) {
 	case "zone":
 		edit_zone_data(srv,target,zone,player,set,cmd);
 		break;
+	default:
+		log("unknown edit mode: '" + player.@editing + "'");
+		break;
 	}
 }
 
@@ -380,11 +386,11 @@ Editor_Commands["LINK"] = function (srv,target,map,room,cmd,player) {
 	cmd.shift();
 	var link=cmd.shift();
 	if(!link) {
-		srv.o(target,"Type 'rpg help unlink' for help.");
+		srv.o(target,"Type 'help link' for help");
 		return;
 	}
-
-	switch(link.tolowerCase()) {
+	
+	switch(link.toLowerCase()) {
 	case "north":
 	case "south":
 	case "east":
@@ -393,14 +399,35 @@ Editor_Commands["LINK"] = function (srv,target,map,room,cmd,player) {
 	case "down":
 		var room_id=cmd.shift();
 		if(!room_id) {
-			srv.o(target,"TODO: auto-link adjacent room if no id is specified");
+			var start=new Coords(0,0,0);
+			var finish=get_exit_coords(start,link.toLowerCase());
+			room_id=find_link(map,room,start,finish,undefined);
+			if(room_id == -1) {
+				srv.o(target,red + "There is no unlinked exit there");
+				return;
+			}
+
+			var target_room=map.room.(@id == room_id);
+			var exit=room.exit.(@name == link.toLowerCase());
+			
+			/* set exit target for current room */
+			if(exit.@target.toString()=="") {
+				room.exit += <exit name={link.toLowerCase()} target={room_id}/>;
+				srv.o(target,green + "Room exit added");
+				/* change corresponding exit for target room */
+				if(settings.autolink) 
+					target_room.exit.(@name == reverse_dir(link.toLowerCase())).(@target = room.@id);
+			} else {
+				srv.o(target,red + "That exit is already linked");
+			}
+			
 		} else {
 			var target_room=map.room.(@id == room_id);
-			var exit=room.exit.(@name == dir);
+			var exit=room.exit.(@name == link.toLowerCase());
 			
 			/* set exit target for current room */
 			if(exit.@target.toString()=="") {
-				room.exit += <exit name={dir} target={room_id}/>;
+				room.exit += <exit name={link.toLowerCase()} target={room_id}/>;
 				srv.o(target,green + "Room exit added");
 
 			/* change exit target for current room */
@@ -410,7 +437,8 @@ Editor_Commands["LINK"] = function (srv,target,map,room,cmd,player) {
 			}
 			
 			/* change corresponding exit for target room */
-			if(settings.autolink) target_room.exit.(@name == reverse_dir(dir)).(@target = room.@id);
+			if(settings.autolink) 
+				target_room.exit.(@name == reverse_dir(link.toLowerCase())).(@target = room.@id);
 		}
 		break;
 	default:
@@ -423,26 +451,27 @@ Editor_Commands["UNLINK"] = function (srv,target,map,room,cmd,player) {
 	cmd.shift();
 	var link=cmd.shift();
 	if(!link) {
-		srv.o(target,"Type 'rpg help unlink' for help.");
+		srv.o(target,"Type 'help unlink' for help");
 		return;
 	}
 
-	switch(link.tolowerCase()) {
+	switch(link.toLowerCase()) {
 	case "north":
 	case "south":
 	case "east":
 	case "west":
 	case "up":
 	case "down":
-		target_id=room.exit.(@name == dir).@target;
+		target_id=room.exit.(@name == link.toLowerCase()).@target;
 		target_room=map.room.(@id == target_id);
 
 		/* clear link if no target specified */
-		room.exit.(@name == dir).(@target=undefined);
+		room.exit.(@name == link.toLowerCase()).@target=undefined;
 		srv.o(target,red + "Room exit deleted");
 
 		/* clear corresponding link in original target room */
-		if(settings.autolink) target_room.exit.(@name == reverse_dir(dir)).(@target=undefined);
+		if(settings.autolink) 
+			target_room.exit.(@name == reverse_dir(link.toLowerCase())).@target=undefined;
 		break;
 	default:
 		srv.o(target,"usage: unlink <direction>");
@@ -464,16 +493,18 @@ Editor_Commands["MOVE"] = function (srv,target,map,room,cmd,player) {
 	room=map.room.(@id == player.@room);
 	
 	list_room_verbose(srv,player,map,room);
+	list_exits_verbose(srv,player,zone.map);
 }
 
 Editor_Commands["MOBS"] = function (srv,target,map,room,cmd,player) {
 	cmd.shift();
 	var param=cmd.shift();
 	if(param && param.toUpperCase() == "ZONE") {
+		var zone=zones[player.@zone];
 		list_mobs_verbose(srv,target,zone.mobs);
 		return;
 	}
-		list_mobs_verbose(srv,target,room);
+	list_mobs_verbose(srv,target,room);
 	return;
 }
 
@@ -481,6 +512,7 @@ Editor_Commands["ITEMS"] = function (srv,target,map,room,cmd,player) {
 	cmd.shift();
 	var param=cmd.shift();
 	if(param && param.toUpperCase() == "ZONE") {
+		var zone=zones[player.@zone];
 		list_items_verbose(srv,target,zone.items);
 		return;
 	}
@@ -518,7 +550,7 @@ Editor_Commands["GOTO"] = function (srv,target,map,room,cmd,player) {
 	var room=map.room.(@id == player.@room);
 	srv.o(target,"You teleport to " + room.title);
 	list_room_verbose(srv,player,map,room);
-	return;
+	list_exits_verbose(srv,player,zone.map);
 }
 
 Editor_Commands["LOOK"] = function (srv,target,map,room,cmd,player) {
@@ -528,9 +560,6 @@ Editor_Commands["LOOK"] = function (srv,target,map,room,cmd,player) {
 	/*	if no target specified, look at room */
 	if(!obj) {
 		list_room_verbose(srv,player,map);
-		srv.o(player.@channel,red + "[title]" + black + " " + room.title);
-		srv.o(player.@channel,red + "[desc]" + black + " " + strip_ctrl(room.description));
-
 		list_mobs_verbose(srv,player.@channel,map,room);
 		list_items_verbose(srv,player.@channel,map,room);
 		list_exits_verbose(srv,player,map);
@@ -1105,8 +1134,9 @@ Server_Commands["PRIVMSG"] = function (srv,cmd,onick,ouh)	{
 	var player=players.player.(@name == onick);
 
 	if (cmd[0][0] == "#" || cmd[0][0] == "&") {
-		var chan=get_privmsg_channel(srv,cmd);
+		var chan=srv.channel[cmd[0].toUpperCase()];
 		if(!chan) return;
+		
 		/* if the user has no RPG player or is not logged in, don't process RPG commands */
 		if(player.@active != 1) return;
 
@@ -1141,21 +1171,19 @@ Server_Commands["JOIN"]= function (srv,cmd,onick,ouh) {
 	}
 	
 	// Me joining.
-	if ((onick == srv.curnick) && !chan.is_joined) {
-		chan.is_joined = true;
-		srv.writeout("WHO " + cmd[0]);
+	if (onick == srv.curnick) {
+		if(!chan.is_joined) {
+			chan.is_joined = true;
+			srv.writeout("WHO " + cmd[0]);
+		}
 		return;
 	}
 	
 	var player=players.player.(@name == onick);
 	/* if the user has no RPG player, greet them */
 	if(!player.length() > 0) {
-		if (cmd[1][0] == ":")
-			cmd[1] = cmd[1].slice(1);
-		var target=cmd[1];
-
-		srv.o(target,"Welcome to RPG test, " + onick + "!","NOTICE");
-		srv.o(target,"Type 'rpg help' to get started.","NOTICE");
+		srv.o(chan.name,"Welcome to RPG test, " + onick + "!","NOTICE");
+		srv.o(chan.name,"Type 'rpg help' to get started.","NOTICE");
 	}
 }
 
diff --git a/exec/ircbots/rpgbot/rpg_functions.js b/exec/ircbots/rpgbot/rpg_functions.js
index db551ca95c..93eec87de6 100644
--- a/exec/ircbots/rpgbot/rpg_functions.js
+++ b/exec/ircbots/rpgbot/rpg_functions.js
@@ -46,7 +46,7 @@ function handle_command(srv,cmd,player,target) {
 			break;
 	}
 	
-	if(player.@editing == 1) {
+	if(player.@editing != undefined) {
 		if(Editor_Commands[cmd[0]]) {
 			Editor_Commands[cmd[0]](srv,target,map,room,cmd,player);
 		} else if(RPG_Commands[cmd[0]] ||
@@ -69,7 +69,7 @@ function handle_command(srv,cmd,player,target) {
 		return;
 	}
 	if(Editor_Commands[cmd[0]]) {
-		srv.o(target,"Type 'rpg edit' to enable editing.");
+		srv.o(target,"Type '" + get_cmd_prefix() + "edit' to enable editing.");
 		return;
 	}
 	
@@ -398,7 +398,7 @@ function load_players() {
 		var player=new XML(p_file.read());
 		p_file.close();
 		player.@active=0;
-		player.@editing=0;
+		player.@editing=undefined;
 		if(!zones[player.@zone]) {
 			player.@zone=0;
 			player.@room=1;
@@ -436,6 +436,8 @@ function list_room_verbose(srv,player,map) {
 	srv.o(player.@channel,"editing '" + blue + map.@name + black + 
 		"' [z:" + blue + " " + map.@id + black + 
 		" r:" + blue + " " + room.@id + black + "]");
+	srv.o(player.@channel,blue + "[title]" + black + " " + room.title);
+	srv.o(player.@channel,blue + "[desc]" + black + " " + strip_ctrl(room.description));
 }
 
 function list_exits_verbose(srv,player,map) {
@@ -445,7 +447,7 @@ function list_exits_verbose(srv,player,map) {
 	for each(var e in exits) {
 		var exit=room.exit.(@name == e);
 		if(exit.@target != undefined) {
-			var exit_str=red + "[" + e +"]";
+			var exit_str=blue + "[" + e +"]";
 			if(zones[exit.@zone]) exit_str+= black + " z:" + blue + " " + exit.@zone;
 			exit_str+= black + " r:" + blue + " " + exit.@target;
 			if(exit.door != undefined) {
@@ -465,7 +467,7 @@ function list_exits_verbose(srv,player,map) {
 				var target_room=map.room.(@id == result);
 				var exit=target_room.exit.(@name == reverse_dir(e));
 
-				var exit_str=red + "[" + e +"]";
+				var exit_str=blue + "[" + e +"]";
 				exit_str+= black + " r:" + blue + " " + target_room.@id;
 				
 				if(exit.door != undefined) {
@@ -482,20 +484,30 @@ function list_exits_verbose(srv,player,map) {
 }
 
 function list_mobs_verbose(srv,target,list) {
+	var count=0;
 	for each(var m in list.mob) {
 		srv.o(target,
-			red + "[mob]" +  
+			blue + "[mob]" +  
 			black + " id:" + blue + " " + m.@id +
 			black + " name:" + blue + " " + m.@name);
+		count++;
+	}
+	if(count == 0) {
+		srv.o(target,red + "there are no mobs to list.");
 	}
 }
 
 function list_items_verbose(srv,target,list) {
+	var count=0;
 	for each(var i in list.item) {
 		srv.o(target,
-			red + "[item]" +  
+			blue + "[item]" +  
 			black + " id:" + blue + " " + i.@id +
 			black + " name:" + blue + " " + i.title);
+		count++;
+	}
+	if(count == 0) {
+		srv.o(target,red + "there are no items to list.");
 	}
 }
 
@@ -568,6 +580,7 @@ function init_room_edit(srv,target,zone,player,id) {
 	player.@editing="room";
 	player.@room=id;
 	list_room_verbose(srv,player,zone.map);
+	list_exits_verbose(srv,player,zone.map);
 }
 
 function init_item_edit(srv,target,zone,player,id) {
@@ -718,7 +731,7 @@ function create_player(name,player_race,player_class) {
 function create_new_object(zone,map,player,object) {
 	switch(object.toUpperCase()) {
 	case "ITEM":
-		var item_id=get_new_item_id(zone.items);
+		var item_id=get_new_object_id(zone.items.item);
 		var item=
 			<item id={item_id}>
 				<type>{settings.default_item_type}</type>
@@ -732,6 +745,16 @@ function create_new_object(zone,map,player,object) {
 		else zone.items=<items>{item}</items>;
 		return item_id;
 	case "MOB":
+		var mob_id=get_new_object_id(zone.mobs.mob);
+		var mob=
+			<mob id={mob_id} name={settings.default_mob_name}>
+				<keywords>{settings.default_mob_keywords}</keywords>
+				<appearance>{settings.default_mob_appearance}</appearance>
+				<hitpoints>{settings.default_mob_hitpoints}</hitpoints>
+			</mob>;
+		if(zone.mobs.mob.length() > 0) zone.mobs.mob += mob;
+		else zone.mobs=<mobs>{mob}</mobs>;
+		return mob_id;
 		break;
 	case "ZONE":
 		var zone_id=get_new_zone_id();
@@ -756,7 +779,7 @@ function create_new_object(zone,map,player,object) {
 }
 
 function create_new_room(srv,target,map,room,player,dir) {
-	var new_id=get_new_room_id(map);
+	var new_id=get_new_object_id(map.room);
 	var old_id=room.@id;
 	/* add this room to previous room's exit list */
 	room.exit +=<exit name={dir} target={new_id}/>;
@@ -792,6 +815,7 @@ function create_new_room(srv,target,map,room,player,dir) {
 	player.@room=new_id;
 	srv.o(target,"Room " + new_id + " created");
 	list_room_verbose(srv,player,map,new_room);
+	list_exits_verbose(srv,player,zone.map);
 }
 
 function get_dir_coords(exclude) {
@@ -881,12 +905,12 @@ function reverse_dir(dir) {
 	return dir;
 }
 
-function get_new_room_id(map) {
+function get_new_object_id(list) {
 	var id = 0;
-	var r = map.room.(@id == id);
-	while(r != undefined) {	
+	var i = list.(@id == id);
+	while(i != undefined) {	
 		id++;
-		r=map.room.(@id == id);
+		i=list.(@id == id);
 	}
 	return id;
 }
@@ -899,14 +923,4 @@ function get_new_zone_id() {
 		z=zones[id];
 	}
 	return id;
-}
-
-function get_new_item_id(items) {
-	var id = 0;
-	var i = items.item.(@id == id);
-	while(i.length() > 0) {	
-		id++;
-		i=items.item.(@id == id);
-	}
-	return id;
-}
+}
\ No newline at end of file
diff --git a/exec/ircbots/rpgbot/rpg_help.js b/exec/ircbots/rpgbot/rpg_help.js
index a05b871e03..ff37802fbb 100644
--- a/exec/ircbots/rpgbot/rpg_help.js
+++ b/exec/ircbots/rpgbot/rpg_help.js
@@ -72,28 +72,27 @@ Help_Topics["LINK"]=[
 Help_Topics["SET"]=[
 	"change a setting:",
 	"set [new/current] [title/description] <text>",
-	"set autolink on/off",
+	"set autolink (on/off toggle)",
 	"note: autolink will automatically add adjacent",
 	" room exit links for you, if any. they can still",
 	" be set/unset manually"
 ];
-Help_Topics["NEW"]=[
-	"create a new zone or object:",
-	"new zone <level> <title>",
-	"new item <not yet implemented>",
-	"new mob <not yet implemented>",
-	"new door <not yet implemented>"
-];
 Help_Topics["CREATE"]=[
 	"To start playing, you must first create a character.",
-	"To see a list of character races and classes, type 'rpg classes' and 'rpg races'.",
-	"When you have settled on a combination, type 'rpg create <race> <class>.",
-	"Once your character is created type 'rpg login' to start playing!"
+	"To see a list of character races and classes, type '" 
+	+ get_cmd_prefix() + "classes' and '" 
+	+ get_cmd_prefix() + "races'.",
+	"When you have settled on a combination, type '" 
+	+ get_cmd_prefix() + "create <race> <class>.",
+	"Once your character is created type '" 
+	+ get_cmd_prefix() + "login' to start playing!"
 ]
 Help_Topics["EDIT"]=[
 	"The default world is very small. To get comfortable you may want to start by creating a new zone, and seeing how everything works.",
-	"You must first create a character and login before you can edit. Once you have logged in, type 'rpg edit' to toggle the editor on/off.",
-	"To create a new zone, turn the editor on and type 'new zone <level> <my new zone name>'.",
+	"You must first create a character and login before you can edit. Once you have logged in, type '" 
+	+ get_cmd_prefix() + "edit' to toggle the editor on/off.",
+	"To create a new zone, turn the editor on and type '" 
+	+ get_cmd_prefix() + "edit new zone'.",
 	"By default, all exits will link automatically if the editor finds a room that is adjacent to you upon creating a new room. You can either turn this feature off, or modify those links later if you choose.",
 	"To create new rooms, simply walk in any direction while in edit mode.",
 	"see topics: 'set','unset','new','goto'"
-- 
GitLab