// $Id: cmd_obj.inc,v 1.5 2004/03/13 17:41:44 druid Exp $ procedure do_get(ch:GCharacter;param:string); var obj, obj_in :GObject; arg,arg2:string; d : integer; node : GListNode; iterator : GIterator; begin param:=one_argument(param,arg); one_argument(param,arg2); if (length(arg)=0) and (length(arg2) = 0) then begin ch.sendBuffer('Get what?'#13#10); exit; end; if (ch.room.flags.isBitSet(ROOM_NOTRADE)) or (ch.room.vnum >= system_info.arena_start) and (ch.room.vnum <= system_info.arena_end) then begin ch.sendBuffer( 'That is not allowed here.'#13#10); exit; end; if (arg = 'all') and (length(arg2) = 0) then begin if (ch.room.objects.size() = 0) then begin ch.sendBuffer('There is nothing here.'#13#10); exit; end; iterator := ch.room.objects.iterator(); while (iterator.hasNext()) do begin obj := GObject(iterator.next()); if (IS_SET(obj.flags,OBJ_NOPICKUP) and (not ch.IS_IMMORT)) then begin ch.sendBuffer('You cannot pick that up.'#13#10); continue; end; for d := 1 to obj.count do begin act(AT_REPORT,'You get $p.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n gets $p.',false,ch,obj,nil,TO_ROOM); end; if (obj.item_type=ITEM_MONEY) then begin ch.gold := ch.gold + obj.value[1]; obj.Free(); end else begin obj.fromRoom; obj.toChar(ch); end; end; iterator.Free(); exit; end; if (arg = 'all') and (length(arg2)<>0) then begin obj := ch.room.findObject(arg2); if (obj = nil) then begin ch.sendBuffer('That is not here.'#13#10); exit; end; if (obj.contents.size() = 0) then begin act(AT_REPORT,'$p is empty.',false,ch,obj,nil,TO_CHAR); exit; end; repeat node := obj.contents.tail; obj_in := GObject(node.element); act(AT_REPORT,'You get $p from $P.',false,ch,obj_in,obj,TO_CHAR); act(AT_REPORT,'$n gets $p from $P.',false,ch,obj_in,obj,TO_ROOM); obj.seperate(); if (obj_in.item_type=ITEM_MONEY) then begin ch.gold := ch.gold + obj_in.value[1]; obj_in.Free(); end else begin obj_in.fromObject; obj_in.toChar(ch); end; until (obj.contents.tail = nil); exit; end; { Get <item> <container> - Nemesis } if (length(arg) <> 0) and (length(arg2) <> 0) then begin obj := ch.room.findObject(arg2); if (obj = nil) then begin ch.sendBuffer('That is not here.'#13#10); exit; end; if (obj.contents.size() = 0) then begin act(AT_REPORT,'$p is empty.',false,ch,obj,nil,TO_CHAR); exit; end; iterator := obj.contents.iterator(); while (iterator.hasNext()) do begin obj_in := GObject(iterator.next()); if (isName(obj_in.name, arg)) then begin act(AT_REPORT,'You get $p from $P.',false,ch,obj_in,obj,TO_CHAR); act(AT_REPORT,'$n gets $p from $P.',false,ch,obj_in,obj,TO_ROOM); obj_in.seperate(); if (obj_in.item_type = ITEM_MONEY) then begin ch.gold := ch.gold + obj_in.value[1]; obj_in.Free(); end else begin obj_in.fromObject; obj_in.toChar(ch); end; iterator.Free(); exit; end; end; iterator.Free(); ch.sendBuffer( 'That is not in there.'#13#10); exit; end; if (length(arg2)=0) then begin obj:= ch.room.findObject(arg); if (obj=nil) then begin ch.sendBuffer('That is not here.'#13#10); exit; end; if (IS_SET(obj.flags,OBJ_NOPICKUP) and (not ch.IS_IMMORT)) then begin ch.sendBuffer('You cannot pick that up.'#13#10); exit; end; act(AT_REPORT,'You get $p.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n gets $p.',false,ch,obj,nil,TO_ROOM); obj.seperate(); if (obj.item_type=ITEM_MONEY) then begin ch.gold := ch.gold + obj.value[1]; obj.Free(); end else begin obj.fromRoom; obj.toChar(ch); end; exit; end; ch.sendBuffer('Get what?'#13#10); end; procedure do_drop(ch:GCharacter;param:string); var obj : GObject; iterator : GIterator; d : integer; begin if (length(param) = 0) then begin ch.sendBuffer( 'Drop what?'#13#10); end; if (ch.inventory.size() = 0) then begin ch.sendBuffer( 'You move your arms around wildly, but nothing happens.'#13#10); exit; end; // prevent trading in battlegrounds if (ch.room.flags.isBitSet(ROOM_NOTRADE)) or (ch.room.vnum >= system_info.arena_start) and (ch.room.vnum <= system_info.arena_end) then begin ch.sendBuffer( 'That is not allowed here.'#13#10); exit; end; if (param = 'all') then begin if (ch.room.flags.isBitSet(ROOM_NODROPALL)) then begin ch.sendBuffer( 'That is not allowed here.'#13#10); exit; end; iterator := ch.inventory.iterator(); while (iterator.hasNext()) do begin obj := GObject(iterator.next()); if IS_SET(obj.flags,OBJ_NODROP) then ch.sendBuffer('You cannot drop that.'#13#10) else begin for d := 1 to obj.count do begin act(AT_REPORT,'You drop $p$7.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n drops $p$7.',false,ch,obj,nil,TO_ROOM); end; obj.fromChar; obj.toRoom(ch.room); end; end; end else begin obj := ch.findInventory(param); if (obj = nil) then ch.sendBuffer('You move your arms around wildly, but nothing happens.'#13#10) else if IS_SET(obj.flags,OBJ_NODROP) then ch.sendBuffer('You cannot drop that.'#13#10) else begin act(AT_REPORT,'You drop $p$7.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n drops $p$7.',false,ch,obj,nil,TO_ROOM); obj.seperate; obj.fromChar; obj.toRoom(ch.room); end; end; end; procedure do_sacrifice(ch:GCharacter;param:string); var obj, obj_in : GObject; node, node_next : GListNode; begin if (length(param)=0) then begin ch.sendBuffer('Sacrifice what?'#13#10); exit; end; one_argument(param, param); obj := ch.room.findObject(param); if obj=nil then ch.sendBuffer('That is not here.'#13#10) else if (IS_SET(obj.flags,OBJ_NOSAC)) and (not ch.IS_IMMORT) then ch.sendBuffer('That is not a sacrificable object.'#13#10) else begin obj.seperate; act(AT_REPORT,'You nobly sacrifice $p$7 to the gods.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n nobly sacrifices $p$7 to the gods.',true,ch,obj,nil,TO_ROOM); if (ch.level < 50) and (not ch.IS_NPC) then begin act(AT_REPORT,'You get 1 $6copper$7 coin on your bank for your donation.',false,ch,nil,nil,TO_CHAR); inc(GPlayer(ch).bankgold); end; node := obj.contents.head; while (node <> nil) do begin node_next := node.next; obj_in := GObject(node.element); obj_in.Free(); node := node_next; end; obj.Free(); end; end; procedure do_wear(ch:GCharacter;param:string); var obj : GObject; iterator : GIterator; cnt : integer; begin if (length(param)=0) then begin ch.sendBuffer('Wear what?'#13#10); exit; end; if (param = 'all') then begin if (ch.inventory.size() = 0) then begin ch.sendBuffer('You are not carrying anything!'#13#10); exit; end; iterator := ch.inventory.iterator(); cnt := 0; while (iterator.hasNext()) do begin obj := GObject(iterator.getCurrent()); iterator.next(); if (obj.wear_location1 <> '') or (obj.wear_location2 <> '') then if (ch.equip(obj)) then begin obj.seperate(); inc(cnt); end; end; iterator.Free(); if (cnt = 0) then ch.sendBuffer( 'You aren''t carrying anything that can be worn.'#13#10); end else begin obj := ch.findInventory(param); if (obj = nil) then begin ch.sendBuffer('You are not carrying that item.'#13#10); exit; end; if (obj.wear_location1 = '') and (obj.wear_location2 = '') then begin act(AT_REPORT, '$p cannot be worn.', false, ch, obj, nil, TO_CHAR); exit; end; if (ch.equip(obj)) then obj.seperate; end; end; procedure do_remove(ch:GCharacter;param:string); var iterator : GIterator; obj : GObject; begin if (length(param)=0) then begin ch.sendBuffer('Remove what?'#13#10); exit; end; if (param = 'all') then begin iterator := ch.equipment.iterator(); while (iterator.hasNext()) do begin obj := GObject(iterator.next()); if IS_SET(obj.flags,OBJ_NOREMOVE) then act(AT_REPORT,'You cannot remove $p$7.',false,ch,obj,nil,TO_CHAR) else begin act(AT_REPORT,'You remove $p.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n removes $p.',false,ch,obj,nil,TO_ROOM); obj.fromChar(); obj.worn := ''; obj.toChar(ch); ch.affectObject(obj, true); end; end; end else begin obj := ch.findEquipment(param); if (obj = nil) then ch.sendBuffer('You are not wearing this object.'#13#10) else if (IS_SET(obj.flags, OBJ_NOREMOVE)) then act(AT_REPORT,'You cannot remove $p.',false,ch,obj,nil,TO_CHAR) else begin act(AT_REPORT,'You remove $p.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n removes $p.',false,ch,obj,nil,TO_ROOM); obj.fromChar(); obj.worn := ''; obj.toChar(ch); ch.affectObject(obj, true); end; end; { // fix the grouping node := ch.objects.head; while (node <> nil) do begin node_next := node.next; obj := node.element; found := false; // matches tend to be on the right side, so scan from the back node_back := ch.objects.tail; while (node_back <> nil) and (node_back <> node) do begin if (GObject(node_back.element).group(obj)) then begin found := true; break; end; node_back := node_back.prev; end; node := node_next; end; } end; procedure do_swap(ch:GCharacter;param:string); var x, y : GObject; begin x := ch.getEQ('lwield'); y := ch.getEQ('rwield'); if (x = nil) and (y = nil) then act(AT_REPORT,'Left hand, right hand, all hands!',false,ch,nil,nil,TO_CHAR) else begin ch.equipment.remove('rwield'); ch.equipment.remove('lwield'); if (y <> nil) then begin ch.equipment['lwield'] := y; y.worn := 'lwield'; act(AT_REPORT,'You now hold $p in your left hand.',false,ch,y,nil,TO_CHAR); end; if (x <> nil) then begin ch.equipment['rwield'] := x; x.worn := 'rwield'; act(AT_REPORT,'You now hold $p in your right hand.',false,ch,x,nil,TO_CHAR); end; end; end; (* procedure do_throw(ch:GCharacter;param:string); var obj:GObject; vict:GCharacter; dest:GRoom; pexit:GExit; dir,range:integer; dam:integer; sub:string; begin if (length(param)=0) then ch.sendBuffer('Throw <object> <direction> <range>'#13#10) else if ch.position=POS_BASHED then ch.sendBuffer('You are bashed!'#13#10) else begin param:=one_argument(param,sub); obj := ch.findInventory(sub); param:=one_argument(param,sub); dir := findHeading(sub); one_argument(param,sub); try range:=strtoint(sub); except ch.sendBuffer('You must type a valid number for the range.'#13#10); exit; end; if obj=nil then ch.sendBuffer('You are not carrying that!'#13#10) else if not IS_SET(obj.flags,OBJ_MISSILE) then ch.sendBuffer('You cannot throw that!'#13#10) else if dir=-1 then ch.sendBuffer('This direction does not exist.'#13#10) else if range>3 then ch.sendBuffer('You cannot possibly throw that far!'#13#10) else begin pexit := ch.room.findExit(dir); if (pexit=nil) or (IS_SET(pexit.flags, EX_SECRET)) then begin act(AT_REPORT,'You throw $p '+headings[dir]+ ', but notice the wall too late!'#13#10'OUCH! That hurts!',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n attempts to throw something, but notices the wall too late.',false,ch,nil,nil,TO_ROOM); damage(ch,ch,25,TYPE_SILENT); end else if (IS_SET(pexit.flags, EX_CLOSED)) then begin act(AT_REPORT,'You throw $p '+headings[dir]+ ', but it rebounds off the door!'#13#10'OUCH! That hurts!',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n attempts to throw something, but it rebounds off the door.',false,ch,nil,nil,TO_ROOM); damage(ch,ch,15,TYPE_SILENT); end else begin act(AT_REPORT,'You throw $p '+headings[dir]+'.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n throws something '+headings[dir]+'.',false,ch,nil,nil,TO_ROOM); obj.fromChar(); dest := findRoom(pexit.vnum); vict := dest.findRandomChar(); obj.toRoom(dest); if vict=nil then act(AT_REPORT,'It doesn''t seem to have hit anything.',false,ch,nil,nil,TO_CHAR) else begin dam:=rolldice(4,obj.weight div 10); dam:=dam*UMin((range+1) div 3,1); if (dam<10) then begin act(AT_REPORT,'$p hits $N right in $S face.',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'$p hits you right in your face!',false,vict,obj,ch,TO_CHAR); act(AT_REPORT,'$p hits $n right in $s face.',false,vict,obj,ch,TO_ROOM); end else if (dam<30) then begin act(AT_REPORT,'$N grimaces in pain as $p cuts $M open.',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'You grimace in pain as $p cuts you open!',false,vict,obj,ch,TO_CHAR); act(AT_REPORT,'$n grimaces in pain as $p cuts $m open.',false,vict,obj,ch,TO_ROOM); end else if (dam<50) then begin act(AT_REPORT,'$N cries out in agony as $p rips $S head apart!',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'You cry out in agony as $p rips your head apart!',false,vict,obj,ch,TO_CHAR); act(AT_REPORT,'$n cries out in agony as $p rips $s head apart!',false,vict,obj,ch,TO_ROOM); end else if (dam<70) then begin act(AT_REPORT,'As $p hits $M, $N is knocked to the floor!',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'As $p hits you, you are knocked to the floor!',false,vict,obj,ch,TO_CHAR); act(AT_REPORT,'As $p hits $m, $n is knocked to the floor!',false,vict,obj,ch,TO_ROOM); end else if (dam<90) then begin act(AT_REPORT,'$p inflicts heavy wounds and $N screams in pain!',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'$p inflicts heavy wounds and you scream in pain!',false,vict,obj,ch,TO_CHAR); act(AT_REPORT,'$p inflicts heavy wounds and $n screams in pain!',false,vict,obj,ch,TO_ROOM); end else if (dam<110) then begin act(AT_REPORT,'$p trashes $N''s body and pools of blood form on the ground!',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'$p trashes your body and pools of blood form on the ground!',false,vict,obj,ch,TO_CHAR); act(AT_REPORT,'$p trashes $n''s body and pools of blood form on the ground!',false,vict,obj,ch,TO_ROOM); end else begin act(AT_REPORT,'$p smashes $N''s skull to little fragments!!',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'$p smashes your skull to little fragments!!',false,vict,obj,ch,TO_CHAR); act(AT_REPORT,'$p smashes $n''s skull to little fragments!',false,vict,obj,ch,TO_ROOM); end; damage(ch,vict,dam,TYPE_SILENT); end; end; end; end; end; *) { Added drink without argument - Nemesis } procedure do_drink(ch:GCharacter;param:string); var obj : GObject; liq : integer; iterator : GIterator; begin if (length(param) = 0) then begin iterator := ch.room.objects.iterator(); while (iterator.hasNext()) do begin obj := GObject(iterator.next()); if (obj.item_type = ITEM_FOUNTAIN) then begin if (not ch.IS_NPC) and (GPlayer(ch).condition[COND_THIRST] > (MAX_COND - 15)) then begin act(AT_REPORT,'Ow yeah? And spill your ruptured bladder all over the clean floor?',false,ch,nil,nil,TO_CHAR); iterator.Free(); exit; end; liq := obj.value[3]; act(AT_REPORT,'You drink ' + liq_types[liq].name + ' from $p.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n drinks ' + liq_types[liq].name + ' from $p.',false,ch,obj,nil,TO_ROOM); gain_condition(ch,COND_DRUNK,liq_types[liq].affect[COND_DRUNK]); gain_condition(ch,COND_FULL,liq_types[liq].affect[COND_FULL]); gain_condition(ch,COND_THIRST,liq_types[liq].affect[COND_THIRST]); gain_condition(ch,COND_CAFFEINE,liq_types[liq].affect[COND_CAFFEINE]); if (not ch.IS_NPC) then if (GPlayer(ch).condition[COND_THIRST] > (MAX_COND - 15)) then ch.sendBuffer('You are no longer thirsty.'#13#10); iterator.Free(); exit; end; end; iterator.Free(); ch.sendBuffer('Drink what?'#13#10); exit; end; obj := ch.findInventory(param); if (obj = nil) then obj := ch.room.findObject(param); if (obj = nil) then begin ch.sendBuffer('You cannot find that.'#13#10); exit; end; obj.seperate(); if not (obj.item_type in [ITEM_DRINK,ITEM_FOUNTAIN]) then ch.sendBuffer('You cannot drink that.'#13#10) else if (obj.item_type=ITEM_DRINK) and (obj.value[2]=0) then act(AT_REPORT,'$p is empty.',false,ch,obj,nil,TO_CHAR) else if (not ch.IS_NPC) and (GPlayer(ch).condition[COND_THIRST] > (MAX_COND - 15)) then act(AT_REPORT,'Ow yeah? And spill your ruptured bladder all over the clean floor?',false,ch,nil,nil,TO_CHAR) else with obj do begin if item_type=ITEM_DRINK then dec(value[2]); liq := value[3]; if (liq < LIQ_WATER) or (liq>=LIQ_MAX) then begin bugreport('do_drink', 'cmd_obj.inc', 'illegal liquid type ' + inttostr(liq) + ' in ' + obj.name); exit; end; act(AT_REPORT,'You drink ' + liq_types[liq].name + ' from $p.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n drinks ' + liq_types[liq].name + ' from $p.',false,ch,obj,nil,TO_ROOM); gain_condition(ch,COND_DRUNK,liq_types[liq].affect[COND_DRUNK]); gain_condition(ch,COND_FULL,liq_types[liq].affect[COND_FULL]); gain_condition(ch,COND_THIRST,liq_types[liq].affect[COND_THIRST]); gain_condition(ch,COND_CAFFEINE,liq_types[liq].affect[COND_CAFFEINE]); if (not ch.IS_NPC) then if (GPlayer(ch).condition[COND_THIRST] > (MAX_COND - 15)) then ch.sendBuffer('You are no longer thirsty.'#13#10); end; end; procedure do_eat(ch:GCharacter;param:string); var obj:GObject; begin if (length(param)=0) then begin ch.sendBuffer('Eat what?'#13#10); exit; end; obj := ch.findInventory(param); if obj=nil then ch.sendBuffer('You aren''t carrying that.'#13#10) else if (obj.item_type<>ITEM_FOOD) and (not ch.IS_IMMORT) then ch.sendBuffer('You cannot eat that.'#13#10) else if (obj.item_type=ITEM_FOOD) and (obj.value[3]=0) then act(AT_REPORT,'$p is no longer edible.',false,ch,obj,nil,TO_CHAR) else if (not ch.IS_NPC) and (GPlayer(ch).condition[COND_FULL] > (MAX_COND - 15)) then act(AT_REPORT,'Your stomach would not respond nicely when eating this!',false,ch,nil,nil,TO_CHAR) else begin obj.seperate; act(AT_REPORT,'You eat $p.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n eats $p.',false,ch,obj,nil,TO_ROOM); if (obj.item_type=ITEM_FOOD) then begin gain_condition(ch,COND_FULL,25); if (not ch.IS_NPC) then if (GPlayer(ch).condition[COND_FULL] > (MAX_COND - 15)) then ch.sendBuffer('You are full.'#13#10); end; obj.fromChar(); obj.Free(); end; end; procedure do_scalp(ch:GCharacter;param:string); var corpse,scalp:GObject; s_name:string; h:integer; begin if (length(param)=0) then begin ch.sendBuffer('Scalp what?'#13#10); exit; end; if (ch.getWield(ITEM_WEAPON) = nil) then begin ch.sendBuffer('You cannot scalp without wielding a weapon.'#13#10); exit; end; corpse := ch.room.findObject(param); if (corpse=nil) then begin ch.sendBuffer('That is not here.'#13#10); exit; end; if (corpse.item_type<>ITEM_CORPSE) then begin ch.sendBuffer('That is not a corpse.'#13#10); exit; end; h:=pos('of',corpse.short); if (h=0) then begin ch.sendBuffer('You cannot scalp that corpse.'#13#10); exit; end; s_name := copy(corpse.short, h,length(corpse.short) - cardinal(h) + 1); s_name := left(s_name,'$'); scalp := GObject.Create; with scalp do begin name := 'the head ' + s_name; short := 'the head ' + s_name; long := 'the head of a once famous warrior lays here'; item_type := ITEM_TRASH; objectList.add(scalp); end; with corpse do begin short := '$4the mutilated corpse ' + s_name + '$7'; long := '$4the mutilated corpse ' + s_name + ' is lying here$7'; item_type := ITEM_TRASH; end; scalp.toChar(ch); act(AT_REPORT,'You draw your weapon and rip off $p.',false,ch,scalp,nil,TO_CHAR); end; { Added give ALL and give <amount> COINS <char> - Nemesis } { Revised 13/Feb/2001 - Nemesis } procedure do_give(ch:GCharacter;param:string); var arg, arg2, arg3 : string; obj : GObject; vict : GCharacter; value, counter : integer; node : GListNode; begin param := one_argument(param,arg); param := one_argument(param,arg2); one_argument(param,arg3); counter := 0; if (length(arg) = 0) or (length(arg2) = 0) then begin ch.sendBuffer('Give what to whom?'#13#10); exit; end; if (length(arg) > 0) and (length(arg2) > 0) and (uppercase(arg2) <> 'COINS') and (length(arg3) > 0) then begin ch.sendBuffer('Give what to whom?'#13#10); exit; end; // prevent trading in battlegrounds if (ch.room.flags.isBitSet(ROOM_NOTRADE)) or (ch.room.vnum >= system_info.arena_start) and (ch.room.vnum <= system_info.arena_end) then begin ch.sendBuffer( 'That is not allowed here.'#13#10); exit; end; if (length(arg) > 0) and (uppercase(arg2) = 'COINS') and (length(arg3) > 0) then begin vict := ch.room.findChar(ch,arg3); if (vict = nil) then begin ch.sendBuffer('They are not here.'#13#10); exit; end; try value := strtoint(arg); except begin ch.sendBuffer('You must type a value.'#13#10); exit; end; end; if (value > ch.gold) then begin ch.sendBuffer('You don''t have that much money.'#13#10); exit; end; ch.gold := ch.gold - value; vict.gold := vict.gold + value; act(AT_REPORT,'You give ' + inttostr(value) + ' coins to $N.',false,ch,nil,vict,TO_CHAR); act(AT_REPORT,'$n gives you ' + inttostr(value) + ' coins.',false,ch,nil,vict,TO_VICT); act(AT_REPORT,'$N gives $n some coins.',false,vict,nil,ch,TO_NOTVICT); exit; end; if (uppercase(arg) = 'ALL') and (length(arg2) > 0) then begin vict := ch.room.findChar(ch,arg2); if (vict = nil) then begin ch.sendBuffer('They are not here.'#13#10); exit; end; node := ch.inventory.tail; while (node <> nil) do begin obj := GObject(node.element); act(AT_REPORT,'You give $p to $N.',false,ch,obj,vict,TO_CHAR); act(AT_REPORT,'$n gives $N $p.',false,ch,obj,vict,TO_ROOM); inc(counter); obj.seperate; obj.fromChar; obj.toChar(vict); node := node.next; end; if (counter = 0) then begin ch.sendBuffer('You have nothing to give.'#13#10); exit; end; exit; end; obj := ch.findInventory(arg); vict := ch.room.findChar(ch,arg2); if (obj = nil) then begin ch.sendBuffer('You are not carrying that.'#13#10); exit; end; if (vict = nil) then begin ch.sendBuffer('They are not here.'#13#10); exit; end; obj.seperate; obj.fromChar; obj.toChar(vict); act(AT_REPORT,'You give $N $p.',false, ch, obj, vict, TO_CHAR); act(AT_REPORT,'$n gives $N $p.',false, ch, obj, vict, TO_ROOM); if (vict.IS_NPC) then GNPC(vict).context.runSymbol('onGive', [integer(vict), integer(ch), integer(obj)]); end; { Put objects into container - Nemesis } { Revised 13/Feb/2001 - Nemesis } procedure do_put(ch:GCharacter;param:string); var obj, obj_in : GObject; arg, arg2 : string; node : GListNode; counter : integer; begin param:=one_argument(param,arg); one_argument(param,arg2); counter := 0; if (length(arg) = 0) and (length(arg2) = 0) then begin ch.sendBuffer('Put what where?'#13#10); exit; end; if (arg = 'all') and (length(arg2) <> 0) then begin obj_in := ch.room.findObject(arg2); if (obj_in = nil) then begin ch.sendBuffer('That is not here.'#13#10); exit; end; if (obj_in.item_type <> ITEM_CONTAINER) then begin ch.sendBuffer('That is not a container.'#13#10); exit; end; node := ch.inventory.head; while (node <> nil) do begin obj := GObject(node.element); if IS_SET(obj.flags,OBJ_NODROP) then ch.sendBuffer('You can''t put that anywhere.'#13#10) else begin act(AT_REPORT,'You put $p in $P.',false,ch,obj,obj_in,TO_CHAR); act(AT_REPORT,'$n puts $p in $P.',false,ch,obj,obj_in,TO_ROOM); inc(counter); obj.seperate; obj.fromChar; obj.toObject(obj_in); end; node := node.next; end; if (counter = 0) then begin ch.sendBuffer('You cannot put anything anywhere.'#13#10); exit; end; exit; end else begin obj_in := ch.room.findObject(arg2); obj := ch.findInventory(arg); if (obj = nil) then begin ch.sendBuffer('You don''t have that.'#13#10); exit; end; if (obj_in = nil) then begin ch.sendBuffer('That is not here.'#13#10); exit; end; if (obj_in.item_type <> ITEM_CONTAINER) then begin ch.sendBuffer('That is not a container.'#13#10); exit; end; if IS_SET(obj.flags,OBJ_NODROP) then begin ch.sendBuffer('You can''t put that anywhere.'#13#10); exit; end else begin act(AT_REPORT,'You put $p in $P.',false,ch,obj,obj_in,TO_CHAR); act(AT_REPORT,'$n puts $p in $P.',false,ch,obj,obj_in,TO_ROOM); obj.seperate; obj.fromChar; obj.toObject(obj_in); end; end; end; { Refill ITEM_DRINK with liquid type of fountain - Nemesis } procedure do_fill(ch:GCharacter;param:string); var obj, objsource : GObject; liq : integer; iterator : GIterator; begin if (length(param) = 0) then begin ch.sendBuffer('Fill what?'#13#10); exit; end; obj := ch.FindInventory(param); if (obj = nil) then begin ch.sendBuffer('You don''t have that.'#13#10); exit; end; if (obj.item_type <> ITEM_DRINK) then begin ch.sendBuffer('You cannot fill that.'); exit; end; if (ch.room.objects.size() = 0) then begin ch.sendBuffer('You cannot fill that here.'#13#10); exit; end; iterator := ch.room.objects.iterator(); while (iterator.hasNext()) do begin objsource := GObject(iterator.next()); if (objsource.item_type = ITEM_FOUNTAIN) then begin liq := objsource.value[3]; obj.value[2] := obj.value[1]; obj.value[3] := objsource.value[3]; act(AT_REPORT,'You fill $p with ' + liq_types[liq].name + '.',false,ch,obj,nil,TO_CHAR); act(AT_REPORT,'$n fills $p with ' + liq_types[liq].name + '.',false,ch,obj,nil,TO_ROOM); iterator.Free(); exit; end; end; iterator.Free(); ch.sendBuffer('You cannot fill that here.'); exit; end; { Unlock doors - Nemesis } procedure do_unlock(ch:GCharacter;param:string); var pexit : GExit; room_pos : GRoom; dir : integer; lastobj : GObject; iterator : GIterator; begin if (length(param) = 0) then begin ch.sendBuffer('Unlock what?'#13#10); exit; end; room_pos := ch.room; dir := FindHeading(param); if (dir = -1) then begin ch.sendBuffer('Use direction instead!'#13#10); exit; end; pexit := room_pos.findExit(dir); if (pexit = nil) then begin ch.sendBuffer('You don''t see a door there.'#13#10); exit; end; if (not IS_SET(pexit.flags, EX_ISDOOR)) then begin ch.sendBuffer('That is not a door.'#13#10); exit; end; if (not IS_SET(pexit.flags, EX_LOCKED)) then begin ch.sendBuffer('That door is not locked.'#13#10); exit; end; if IS_SET(pexit.flags, EX_LOCKED) then begin if (ch.inventory.size() = 0) then begin ch.sendBuffer('You don''t have a key.'#13#10); exit; end; iterator := ch.inventory.iterator(); while (iterator.hasNext()) do begin lastobj := GObject(iterator.next()); if (lastobj.item_type = ITEM_KEY) and (pexit.key = lastobj.value[1]) then begin act(AT_REPORT,'You unlock $t.',false,ch,pexit.keywords,nil,TO_CHAR); act(AT_REPORT,'$n unlocks $t.',false,ch,pexit.keywords,nil,TO_ROOM); REMOVE_BIT(pexit.flags, EX_LOCKED); room_pos := findRoom(pexit.vnum); pexit := room_pos.findExit(dir_inv[dir]); REMOVE_BIT(pexit.flags, EX_LOCKED); iterator.Free(); exit; end; end; iterator.Free(); ch.sendBuffer('You lack the key.'#13#10); end; end; { Lock doors - Nemesis } procedure do_lock(ch:GCharacter;param:string); var pexit : GExit; room_pos : GRoom; dir : integer; lastobj : GObject; iterator : GIterator; begin if (length(param) = 0) then begin ch.sendBuffer('Lock what?'#13#10); exit; end; room_pos := ch.room; dir := FindHeading(param); if (dir = -1) then begin ch.sendBuffer('Use direction instead!'#13#10); exit; end; pexit := room_pos.findExit(dir); if (pexit = nil) then begin ch.sendBuffer('You don''t see a door there.'#13#10); exit; end; if (not IS_SET(pexit.flags, EX_ISDOOR)) then begin ch.sendBuffer('That is not a door.'#13#10); exit; end; if (IS_SET(pexit.flags, EX_LOCKED)) then begin ch.sendBuffer('That door is already locked.'#13#10); exit; end; if (not IS_SET(pexit.flags, EX_CLOSED)) then begin ch.sendBuffer('That door should be closed first'#13#10); exit; end else begin if (pexit.key > 0) then begin if (ch.inventory.size() = 0) then begin ch.sendBuffer('You don''t have a key.'#13#10); exit; end; iterator := ch.inventory.iterator(); while (iterator.hasNext()) do begin lastobj := GObject(iterator.next()); if (lastobj.item_type = ITEM_KEY) and (pexit.key = lastobj.value[1]) then begin act(AT_REPORT,'You lock $t.',false,ch,pexit.keywords,nil,TO_CHAR); act(AT_REPORT,'$n locks $t.',false,ch,pexit.keywords,nil,TO_ROOM); SET_BIT(pexit.flags, EX_LOCKED); room_pos := findRoom(pexit.vnum); pexit := room_pos.findExit(dir_inv[dir]); SET_BIT(pexit.flags, EX_LOCKED); iterator.Free(); exit; end; end; iterator.Free(); ch.sendBuffer('You lack the key.'#13#10); end; end; end;