From 21e625d89bf8b9503dbf33a759085b590b39c1a1 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 5 Jul 2014 16:48:59 +0930 Subject: [PATCH 1/5] Added Crisis and Surgeon modules, removed Medical module, added Construction module, altered Mining and Engineering modules. --- .../structures/stool_bed_chair_nest/bed.dm | 38 ++++- .../modules/mob/living/silicon/robot/robot.dm | 30 +++- .../mob/living/silicon/robot/robot_modules.dm | 158 ++++++++++++------ .../living/silicon/robot/robot_movement.dm | 5 + .../reagents/reagent_containers/borghydro.dm | 6 + 5 files changed, 184 insertions(+), 53 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 4f3112cb35..458c275eba 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -115,11 +115,47 @@ icon_state = "folded" w_class = 4.0 // Can't be put in backpacks. Oh well. - attack_self(mob/user) +/obj/item/roller/attack_self(mob/user) var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) del(src) +/obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + + if(istype(W,/obj/item/roller_holder)) + var/obj/item/roller_holder/RH = W + if(!RH.held) + user << "\blue You collect the roller bed." + src.loc = RH + RH.held = src + return + + ..() + +/obj/item/roller_holder + name = "roller bed rack" + desc = "A rack for carrying a collapsed roller bed." + icon = 'icons/obj/rollerbed.dmi' + icon_state = "folded" + var/obj/item/roller/held + +/obj/item/roller_holder/New() + ..() + held = new /obj/item/roller(src) + +/obj/item/roller_holder/attack_self(mob/user as mob) + + if(!held) + user << "\blue The rack is empty." + return + + user << "\blue You deploy the roller bed." + var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) + R.add_fingerprint(user) + del(held) + held = null + + /obj/structure/stool/bed/roller/Move() ..() if(buckled_mob) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1d0dd77e28..00124ffd63 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,7 +5,7 @@ icon_state = "robot" maxHealth = 200 health = 200 - + var/sight_mode = 0 var/custom_name = "" var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best @@ -163,7 +163,7 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security") + var/list/modules = list("Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Security") if(crisis && security_level == SEC_LEVEL_RED) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" @@ -198,15 +198,26 @@ module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" - if("Medical") - module = new /obj/item/weapon/robot_module/medical(src) + if("Crisis") + module = new /obj/item/weapon/robot_module/crisis(src) module.channels = list("Medical" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Medical") module_sprites["Basic"] = "Medbot" + module_sprites["Standard"] = "surgeon" module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" + + if("Surgeon") + module = new /obj/item/weapon/robot_module/surgeon(src) + module.channels = list("Medical" = 1) + if(camera && "Robots" in camera.network) + camera.network.Add("Medical") + + module_sprites["Basic"] = "Medbot" module_sprites["Standard"] = "surgeon" + module_sprites["Advanced Droid"] = "droid-medical" + module_sprites["Needles"] = "medicalrobot" if("Security") module = new /obj/item/weapon/robot_module/security(src) @@ -225,6 +236,15 @@ module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" + if("Construction") + module = new /obj/item/weapon/robot_module/engineering(src) + module.channels = list("Engineering" = 1) + if(camera && "Robots" in camera.network) + camera.network.Add("Engineering") + module_sprites["Basic"] = "Engineering" + module_sprites["Antique"] = "engineerrobot" + module_sprites["Landmate"] = "landmate" + if("Janitor") module = new /obj/item/weapon/robot_module/janitor(src) module_sprites["Basic"] = "JanBot2" @@ -238,7 +258,7 @@ //languages module.add_languages(src) - + //Custom_sprite check and entry if (custom_sprite == 1) module_sprites["Custom"] = "[src.ckey]-[modtype]" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index be0ee66bb4..3e5808ffea 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -9,6 +9,7 @@ var/list/modules = list() var/obj/item/emag = null var/obj/item/borg/upgrade/jetpack = null + var/list/stacktypes emp_act(severity) if(modules) @@ -31,7 +32,21 @@ /obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R) - return + + if(!stacktypes || !stacktypes.len) return + + for(var/T in stacktypes) + var/O = locate(T) in src.modules + var/obj/item/stack/S = O + + if(!S) + src.modules -= null + S = new T(src) + src.modules += S + S.amount = 1 + + if(S && S.amount < stacktypes[T]) + S.amount++ /obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module var/list/temp_list = modules @@ -41,7 +56,9 @@ modules += O /obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) - R.add_language("Tradeband", 0) + R.add_language("Tradeband", 1) + R.add_language("Sol Common", 1) + /obj/item/weapon/robot_module/standard name = "standard robot module" @@ -57,8 +74,49 @@ src.emag = new /obj/item/weapon/melee/energy/sword(src) return -/obj/item/weapon/robot_module/medical - name = "medical robot module" +/obj/item/weapon/robot_module/surgeon + name = "surgeon robot module" + stacktypes = list( + /obj/item/stack/medical/advanced/bruise_pack = 5, + /obj/item/stack/nanopaste = 5 + ) + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) + src.modules += new /obj/item/weapon/scalpel(src) + src.modules += new /obj/item/weapon/hemostat(src) + src.modules += new /obj/item/weapon/retractor(src) + src.modules += new /obj/item/weapon/cautery(src) + src.modules += new /obj/item/weapon/bonegel(src) + src.modules += new /obj/item/weapon/bonesetter(src) + src.modules += new /obj/item/weapon/circular_saw(src) + src.modules += new /obj/item/weapon/surgicaldrill(src) + src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) + src.modules += new /obj/item/stack/nanopaste(src) + + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + return + +/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R) + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/PS = src.emag + PS.reagents.add_reagent("pacid", 2) + ..() + +/obj/item/weapon/robot_module/crisis + name = "crisis robot module" + stacktypes = list( + /obj/item/stack/medical/ointment = 5, + /obj/item/stack/medical/bruise_pack = 5, + /obj/item/stack/medical/splint = 5 + ) New() src.modules += new /obj/item/device/flashlight(src) @@ -66,40 +124,71 @@ src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) + src.modules += new /obj/item/roller_holder(src) + src.modules += new /obj/item/stack/medical/ointment(src) + src.modules += new /obj/item/stack/medical/bruise_pack(src) + src.modules += new /obj/item/stack/medical/splint(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" return -/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R) + var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2)//SYRINGE_BROKEN + if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) S.desc = initial(S.desc) S.update_icon() + if(src.emag) var/obj/item/weapon/reagent_containers/spray/PS = src.emag PS.reagents.add_reagent("pacid", 2) -/obj/item/weapon/robot_module/engineering - name = "engineering robot module" + ..() +/obj/item/weapon/robot_module/construction + name = "construction robot module" + + stacktypes = list( + /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/plasteel = 10, + /obj/item/stack/sheet/rglass = 50 + ) + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + +/obj/item/weapon/robot_module/engineering + name = "engineering robot module" + + stacktypes = list( + /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/rglass = 50, + /obj/item/weapon/cable_coil = 50, + /obj/item/stack/rods = 15, + /obj/item/stack/tile/plasteel = 15 + ) New() src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) - src.emag = new /obj/item/borg/stun(src) - src.modules += new /obj/item/weapon/rcd/borg(src) src.modules += new /obj/item/weapon/extinguisher(src) -// src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/weapon/weldingtool/largetank(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) @@ -109,6 +198,10 @@ src.modules += new /obj/item/device/t_scanner(src) src.modules += new /obj/item/device/analyzer(src) src.modules += new /obj/item/taperoll/engineering(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/weapon/matter_decompiler(src) + + src.emag = new /obj/item/borg/stun(src) var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) M.amount = 50 @@ -124,24 +217,6 @@ return -/obj/item/weapon/robot_module/engineering/respawn_consumable(var/mob/living/silicon/robot/R) - var/list/stacks = list ( - /obj/item/stack/sheet/metal, - /obj/item/stack/sheet/rglass, - /obj/item/weapon/cable_coil, - ) - for(var/T in stacks) - var/O = locate(T) in src.modules - if(O) - if(O:amount < 50) - O:amount++ - else - src.modules -= null - O = new T(src) - src.modules += O - O:amount = 1 - return - /obj/item/weapon/robot_module/security name = "security robot module" @@ -250,11 +325,11 @@ src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) - src.emag = new /obj/item/borg/stun(src) + src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/storage/bag/ore(src) src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) -// src.modules += new /obj/item/weapon/shovel(src) Uneeded due to buffed drill + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) return /obj/item/weapon/robot_module/syndicate @@ -286,7 +361,7 @@ /obj/item/weapon/robot_module/drone name = "drone module" - var/list/stacktypes = list( + stacktypes = list( /obj/item/stack/sheet/wood/cyborg = 1, /obj/item/stack/sheet/mineral/plastic/cyborg = 1, /obj/item/stack/sheet/rglass/cyborg = 5, @@ -327,20 +402,9 @@ var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules C.reagents.add_reagent("cleaner", 3) - for(var/T in stacktypes) - var/O = locate(T) in src.modules - var/obj/item/stack/sheet/S = O - - if(!S) - src.modules -= null - S = new T(src) - src.modules += S - S.amount = 1 - - if(S && S.amount < stacktypes[T]) - S.amount++ - var/obj/item/device/lightreplacer/LR = locate() in src.modules LR.Charge(R) + ..() + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index f1a62754b4..c3b7d43c05 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,3 +1,8 @@ +/mob/living/silicon/robot/Process_Spaceslipping(var/prob_slip) + if(module && (istype(module,/obj/item/weapon/robot_module/construction) || istype(module,/obj/item/weapon/robot_module/drone))) + return 0 + ..(prob_slip) + /mob/living/silicon/robot/Process_Spacemove() if(module) for(var/obj/item/weapon/tank/jetpack/J in module.modules) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index a8d88bcf20..d69773b5d4 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -18,6 +18,12 @@ var/list/reagent_ids = list("tricordrazine", "inaprovaline", "spaceacillin") //var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "anti_toxin", "inaprovaline", "spaceacillin") +/obj/item/weapon/reagent_containers/borghypo/surgeon + reagent_ids = list("bicaridine", "inaprovaline", "dexalin") + +/obj/item/weapon/reagent_containers/borghypo/crisis + reagent_ids = list("tricordrazine", "inaprovaline", "tramadol") + /obj/item/weapon/reagent_containers/borghypo/New() ..() for(var/R in reagent_ids) From 6499385279fd333abea905a324f702a1c20b3953 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 8 Jul 2014 19:44:33 +0930 Subject: [PATCH 2/5] Temp commit with robot module work --- .../mob/living/silicon/robot/robot_items.dm | 30 ++++++++++++++---- .../mob/living/silicon/robot/robot_modules.dm | 18 +++++++++++ icons/mob/head.dmi | Bin 110003 -> 111471 bytes icons/mob/roaper.dmi | Bin 0 -> 4938 bytes 4 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 icons/mob/roaper.dmi diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 1c24a5e75d..00d1b0abf0 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -95,14 +95,26 @@ var/mode = 1 /obj/item/weapon/pen/robopen/attack_self(mob/user as mob) + + var/choice = input("Would you like to change colour or mode?") as null|anything in list("Colour","Mode") + if(!choice) return + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - if (mode == 1) - mode = 2 - user << "Changed printing mode to 'Rename Paper'" + + switch(choice) + + if("Colour") + var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow") + if(newcolour) color = newcolour + + if("Mode") + if (mode == 1) + mode = 2 + else + mode = 1 + user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'" + return - if (mode == 2) - mode = 1 - user << "Changed printing mode to 'Write Paper'" // Copied over from paper's rename verb // see code\modules\paperwork\paper.dm line 62 @@ -120,6 +132,12 @@ add_fingerprint(user) return +/obj/item/weapon/form_printer + name = "paperwork printer" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "paper_bin1" + item_state = "sheet-metal" + //Personal shielding for the combat module. /obj/item/borg/combat/shield name = "personal shielding" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 3e5808ffea..d1fca617a0 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -311,6 +311,24 @@ R.add_language("Tradeband", 1) R.add_language("Gutter", 1) +/obj/item/weapon/robot_module/clerical + name = "clerical robot module" + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/weapon/pen/robopen(src) + + add_languages(var/mob/living/silicon/robot/R) + R.add_language("Sol Common", 1) + R.add_language("Sinta'unathi", 1) + R.add_language("Siik'maas", 1) + R.add_language("Siik'tajr", 0) + R.add_language("Skrellian", 1) + R.add_language("Rootspeak", 1) + R.add_language("Tradeband", 1) + R.add_language("Gutter", 1) + /obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R) var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules E.reagents.add_reagent("enzyme", 2) diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index c0e431f14aee3c651202ec6a0d45e2dcf7c40209..62c00fe9dc75c9b8d40d0cafa867a1b4de23e5ff 100644 GIT binary patch delta 14706 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 Lm1Rn#jNbnbuN~}W delta 13227 zcmb`tbyQT*_cweA0cli9N z0}RZ}bMgCo-gm8Mt><0u`mNvjWA3_h_Br>QU1#sl*?WJ9s^^G4-NCyRbC(~yqHoG8 zRFxaQ<~Rmx3o(DBGV)rLVCP}G*9|%K=o@K?3otebAM|Jo?qU<=rh!>~TMk#bZA@TyrZBJCt=3;Ow%%2tA^000oL%T(Kl1>SnuMu- z(UMhT|2A0G$IkVzSL2n1LG-5mH!~g&C!6Z(SdIne#J-qC$vuIObIQHtxg*la0P5fVuL%&p_0#5Lb9-3<`fI4hsD><4WMJM)Y~9 z+Lk=se3xJUBadE{;z*sf?Ro*1N@e;7la!7u(umL0S}DCuhp*d=KmLtZ8GZq?{G#lN z-#gxQb)#kKecxVRU}+g4=gv*(upPG=@P{6(vl1`fO}|AUkV}LQ%1nYPf7h3-n345~%I{@~8hv@Z*K0G$z?sYgH=LC-gx`QLdzjfGgCSNC7xR^$w!u z{1e6IkjV7EODfO2erIwx>Tl7cjuy>)u1l3d{Cyoq`SbZAfcLa+x-@Q;d%prZU|GPU z&|!8Iy_eGs7FJFaRt^>>sJ|e8^~Asx=@Cl7m>dvvqjCy)mBj77N5*u+SO9Pl>~Jmm z{zIz>yz0uiBTnORcYdXo0T)+~)67Aswgxr}pr(enYfNkx4M4YI5SEFVDDtJ+w`aQ;Z7uBchb0QmCAnb`SB~ zbKE*9HB~dcG$Byqwh`&UwM?hEHz$9y9rf3v2b<)s&k7(StW z!@Z`(i9;uVpaMQ8WVLiL_EiPc+-+EA4cWZc8BEc+o&lEqOnG&#P?4}B*@|~=f& za3Ki)y;V1mCaTjgdO&}LcKIt}uKuMSd1%j43@0mi5aOG;&Tq&HVxrqnLU-KeAD-{G z`_-?e*z@tf_v~Tea5!AM>U}h*ZDZti07$JELv8j_NuNca9RqZuu^gacg>EFdFi``LNh(ZTrYPzKI5-Th+ohvOigE_K@t^NRzHP)Yx1 zo&3y*83DKYyvLv57wf;$ysrD=##sM-!#wKP@M?4$2P-)AV|8!l^n9uM;M7Ydm)mO{Jy5P9d+fY3 zT`A+ZDD1NJdclXUp~**IKUoH|wPnp~P^UbV@zZ9qMBP6ifCV*}AqlG&dT(^X**!Ew zC6q$pOfOk}zIUf(d(Xo@R^zn>9#BwJgby%8$pccMZB(E)#@mG~-D`0!cYJP3-OARo zT0CY&Jh$$ykWk&kIsfCwn)Q2ls^xoSLe0m&HU2cv_7MTPhvUq(*jeEv0TD^CWqfa+ zq+;}%SkaU7$Oi@ilwhh(-MFwdDy%MWL$^)5YHoQK9YOcNx*m&0Zs(n}6-auY?rWbP z7nGN-^Md^Rs-CvcPAy?g2}b4MY>ic^5e|izb2-1Vyop>`AaZN-fj<9B=#m49ii&tZ zTzvd(US4wG)2C0F8#K=s^k9TbH8oE{Fh}b{Js(*_cH>KSNlLeJNe0TzJWzITe zv?|_*S$5-^LCdBdED*Myi83_r+rZS!j5fB95U7}WzkhV3d9qD|Z)Ro|pOnM^NXf_$czb()DCU2jU%VZpmc=aD@T$3rwZfEm**9%FQl7Ol&7APcl`P2CCtNp2^E5gWMYr?w^6pz%S#fc5cYIYzQBzX`05J69#~(#n#R4GK zJ1{u-xdjQ`%9Ls4tp^V%!otER5lO=Ktn3^d520==OoiRqV!y_Xt?T21r2HsBLP;>S%X=$ZC z-rzZ+zHx%SzrTMxy17}5oK1pxwI@o(E2p|Fv-I}IfYV`3P0j1ceArNe8Kh<7DMxa0 z@`uu;;b9=6`*+2Jfs9N5`ZoGGfA&(X?Qm?<`BK^vxV!81K)j7u?(|LLhx^vn){*j{au&!ORv z|M*^*xv^0KfZT7pd&o$+&t3T60QlY=C->eC<=gDJ`VRz3T%O)#%4=kgS2sU|4M5oxE0( zHbFr_>(i)+2$?r;m`O=VhjSFDy1KhfR(~{9=(ok7u=Ve`BM*9`Qu%Aw2wZN=n51{2QSCt^vj3Vx4AU^^(2)oRxc1lvTUu1o4ja z5h7tIBS}K8usZJf7@Lx{bx~X$uWm(qX}K2$jSSYSwzv;!X=%A5=AX_d+IL~4wcNj| zvK?=ZDWEr2A!kj2P>~e68P%wahdM%PN!CwH!qLay!<)q}M;v@M9G$K3!FYCl z+E=(SvTnK+U#H>;dCFeVm5}D^M99h{(mdh=GPS0O;?_Y6P4Iw>j_i|L2i5)Z9xkB5 z>%-fg_w~*%#KSkfafB(gc7itRd+MMrRs5`&wuOm1mh3&lY zHS>iUYgm|sCH$6N?JOOheGoey<_=MZfi$7r$NLGbjx#k5G}!k@q{!!#2uK~~XE~Vx zhdaVL6sFq=k~zH$VYJAI@Q4vPs~?c=tgLSr*X0)#DOtn6Yr~?iUca{-!QTo1;}es& zZV8ak#Kb^O>A9U2E$ipkq9^XHH+>=^!W}LwS@H1^kJY;>WA1Zu5>w$!#jv2)xsym6 zjxDY3X2!*8<~Z7);ZI~(n0kGcrGihB%l6mcrSNdlCr_T-f=tAq?!DhcqruckTN@bJ zSx`>${a)-<3JMBq5?ADl{V!y9lOC-)zVW_KuIb26xeR<2o1%KRXfMt&G0}0t_9Jew zb=sqql^%b`Z)#RI8uC65^BO>A(IK~sb6kXN&+=+Y-uZNx11cqL#I2f z&z#61R{?4MHyd#61#{n^7QNqRl|W-a#PyiVdV5PCD^Jq=BVk1O18X^1S<{UQ6YCW7 z>nru8C%Bh;y;R?YQU-4yhi7uKCMG7nET(8*`FtIL?C}>}#F?VqyrKSBq+KdwHOU8jg)9Pl91z+jf-B_@m%@o&M zlA2^J-{mUYa?#ni%RU-Bm*s}<<%&loj?aAFh&+0v%S$J?HaR|SjF_#}tuns~c!|{M z@{U?_-nj#O6C-W58oLLm<=@_$Ay~7(i_%`+%wHlBn8-tB_@Hg4KYo<9OTbjRqH8S` zl$1!ns%C(cz;vB$%FAtnMEX?jsK~Arh|99_zcC39!ozdFDj5L9-9 zrZL(e`grq&qM|g!5lD?HZRdnsFl43u33yzL(r>&6mGY(eMn2lk)!lydNW(Utq@%3L z9cdH%JDdFpQ)59+#qU`d!bfi`TG(#Ej*E{^d)wP(jp3t@jxkkBwht2zd(-EQfTAL9 z=IM7o{NNTh=;;fmR`Hz_OuMJ(rdU9F=p6xtBp7 z2Xbb3Yiw~3WVezuT(UJ^iU8%nn}Z!M)TH?S{d;I+8yUC&x#hSGV|^BK?2&_!&%aEg!BpA}$o zEWkILE;Vu{=BOrla+hiT6q4^WG%*D=LfNWqe$$`;6J*j`A-uCUeOpueCV==|64 zJRKYuc(S&(*8W~-RTfcRDJ~2^j&shLz#$t%O+l%bhK}Dah{RICyH+z3&r2kslJtXx z#n+YP?*aP<2kQCs!cU$UUz{F5QC{cw0Ah7@bvzKquygSY5N)IUG)nyC%NL>pBnD%q zrmpT6KupEX$49x^6Rk6Mch+NnS^7SL`u3Oy4e!i~jsb3eb4&N8XhYm!BExU5Z5N&ZFY1)YLcbzzKCrI(W6ceNO3D5Bel2iwqpS?tH0d zzlHz+1R|-cpn}y!j*Xo05n)hJ5Wp8LPkS^n%@I~l^v!HM+Rp+53#U-(;#h;IMkVYSfGVg=E;9E#O*tC!CrXzjY$p z>iP1X_$z!c^g1=9HIUu@=$#|JeT(Y_nxx_z#kFA+LIV0IC5*rIG@HGQm~M`iM|vuMq_i{^V7?SYR9}K^|4;d8sL6#VDe(mS(ITHo_cS!59Gj7n)1y@y7Y5Qr; zpFHB_RZetOPJ1?yN%7q?2)69huKe<)rgk}KRQiz+^4%|RtMnDbJAyWoT+p66q4X#> z`n0acqFNF5p|D!N87`|SyOHMe&h?Kc#}B)P&oz&? zsN9fVka0uj0yz$G8Na* zI?c`PU7bIe6>n%W4Euj!pgn^Bf{gwfNDlb_1rGg>U_;rIXFq>B$F((!DU3)Y7?!up zLI!VijzYv9KGvHArv#G*|7IYmV4jYJhx6g)1OTr`5dtP=v*g{m-1xP2PYGFT>yn2; zOSvxmQp2q?<6vp&E@Zv}z}v6zuh$q6r-f)w7Gm~8F?I(`58I-Ec`m;;NHiD;dp9hR zuYieOGWAiz#WQAMyLz@Me=665Hl{C@eEzd2c~h1kzDHr$F3iewRIa4{Mr`8F+A z-#81R>w}Tc3o`h5>pTs&>)kGR?8MACj;U+iv;KQp?c+y};&vCBaw;onOhujlDlg1J;M1;M zfT&HxzNonx|EVf}kc$ETC6BPHRQ3$VAVbXfWEgyz(%c74fjvBAUf7Db^$emUBtDjL zF(mLOK;J$Zv!_09XR*X~Gn$vYDf#v&&H@_0`wGADV%3R7y}q$b+BVim+WqbC4sA?o zjdg(CUfVBS*pSe-CTtb$fl|4VJkrt1igvO&smuW9R)>a`YKS~KI*K122Gt^&gemJw zX0HI>KAn;Pw|IES&d$y*u_*ui@^brPxF?~5`paViV-NwQIGyti&W=Be3?pDd^TOEGp#%`EC#x=SP&sUXR7x%~Yi7bOL!u9G%8xxw>w-fl7 zjQV0-UhDeuw1wlOA%Klo*iAudbC3kh-8Rt{3%|HxdwT7d95hL*Y)!Xyc!yDyIFq%q zw)U^D7f!9GlDycbfGsW9ZjhJ52&-DLRLfr5`KL~KJ}YE^gpb>oM;CPx4{i?=dn~1Q z^0UD>T72Zurhn2$P{VpAm01b}8I4x}+-Ba!HV#-+Jsr=(#6Y_LCB}5mW?Sf-#Mc?K z46s3mRwQ`5TJgv+YgCw>S+AkneZLj&bRDb7Ap8h_i9T`TTDvS92k^UO)b3`NAp;07 z!}+RQ+3X$6>F4L1Goy2tLl28XdYOFR?7g4iX`%S3-NjS=`(9x*sOsZpgn8r2wzj^`6BQK&A=d421Kw|R zF$VKh7Y}wKSpt9mHvO=-XlP9`LFDjGPfxD`3io9yoSB$A_P}OxLS*1s{i@+2(U<`- z?Rea32MjxGLDD)qwU|Y-4B2A0D1`OFw9$ zDE~tBvar|%f+sTf*)N*T*~f=`=z2BY)$S#hl&<1dRftlXUkA;ncoIlH$$2P32z21h zlP-G!IxN0}*9V31_OA@HwclE5#UlYlT=1lobmnLB$O$kq%-EKlRVu(sa;Ef{oWjZ( zmm6Z1i^Jb4K_aaKM7M1eSn+CREzHfi9x1Rd82*=fRM>3??d3;EX%{Id0_}A}*J&lC zDB31mD7LVhCncY;vvQ{o%4BF}tkdAjD7UB4qyY0x89D|wpL*CsF+!MdWO_S$CeUDgHKNx!<`31z{m2J z@+QCer1w)s23QUybeUh7A-PJaJmpQG-dxcUaou4cB_lIH)a#epzM^s!9JvfIq3|xf z);th);G$CQQ$Xp>Eb2;57x5>#%`ODL;!?@HdqdC3XxL<<8 zTlum=IL_vD9+@_bmqD$Wl09taV%=`Jb;KzgWFi+a)Cmf6W|KXNlp>cEQBv~{lm0Gp zv~KHUZ5_BL`5uf~-*&v+&gxzog=8>tr_)USS$X8$GLE)o!Kq88DvaBzi%3{d<9{W} zcCwK$#M|ZJa}KInATNDZw8UwEE;2I$PAV zoM@=CUUyiY4xG9KN5)6cwj1UAaF5lWV%QBjTt#6{B6mX~KTN%9bERWgj-GwS11zI_ zq_@`n@UR7C@oc>W1Q#ZyP1Dwdy5(qgOH$J{E&hpGq1tqz$cVbW_b;^yF>gR09M+^X zT@>D^3^z(JYKaVu+#31oj6fvn;ULArvuu(ycPMj4e_)h2+xT?TAGr}A9YDkgU6ABA zTW^s8?i1tmd3kwBB97U|`*YVS<}R29rlxf2Z9dhy5K&YO5%u=>YZwV4yIbMsHyGi! z(PBJ2Kl9+2Y61ty^M^8k0t}+6aAM#E!vZc{vU<(ivX719=p7vP8aEN^Q6XnFNB(XoWSuhOxU%*nMUPmG@Tj*#x~*~e*)^=0kS zgtE|v4y3+!SMda}Ayw3(*1VJx#r+D_0#USm;5Ow_mzL-A&N85BTQyy5M!@6HynfQnz)`sV`-C4_ z9}<)RX5?p1>70b>I9$;5A%Y%oXjQ6j{1Y!U&S2lMx9jMQnZ`6~Y7548V8Y9f6aaOhUQ5V@R)deK++XC&Z}PY~}KscaRt8e){Pr9rI3vLSkO) zajnbqv>0cwx#hf^zXn%ct}+&??#}*K5xLz|JXDLvdnXq$V_CJ)Fs!W* z7#PT4jtVNdPR?=@FP&zdyha&RdFo9Hd>TGH?d(2s01xs67UX?7_m<`?M13uCd%4TF zHWnmr8t#S4Z;VR?)<*(vo7VyjT6tw052mWPMSBPOegv6xuGklcxJ)}hK+;@5hB;)4 z-DWu>^R-t&Hu0;H1CO(JkY>K{SIc^U%apDLo?Vh>!>8%X8x;dk38C z(d%O1gl=?UkG@OYOKOgGS~{k!_lX}0dA=Gjb+Y6yZ(-1B+l-wp`(|1>v#m^ewrR9} zc%}Sq*EmM1(nQ}`36jq1rHZ;CG}%R~M>WpF%If5wMUe80uOro7bL~B<{>aT;GW_;9 z(N0WK6j+yAC<>0c-vWmm6$Y*OkY$nu!iK=vV#|;u{8Y|DiWvIqO*fceb`mF9^mY#r z5$I3O71~0-cM_L4*!Ku6K-8CU$$t-%ZOjReQ7o%(Td7eC(KH04aV?$~j-wGQxaxJj zWd}7_+{IG@LmW*w+K&eKM77N9`_+cG7^vuA{Telhl*~jos5)+LUo)S)Vhk!KBPXn19)ZFWL)=qGZYJaz?{z%OGVHoVW{3d-HB!p&`qSx zOq;u{?awFiM+7nT%p$eMHHkBs0%*paV54vDCJB%rjc~+E5yGn}{D%kp8JHhaHAA^S z?{C!Y1{CYGK_T@^CL8slag)y;hb$G*7YX>5PY{m{k>dg*O8`3vkP}fmxu>5EX3pA? zG>o%+UrHZEo?fSE7=upIc(!Qa?02CVjigoI?&+XjlzhXC)f-y7upu$`A#;0eXG7U_ zaG_zS?MIgp0hGXbtLvQM?>r~nTCv*YT1jd2zegvD)=s3oFUaqTOw-R6*8i?7>CQ;q zX7ajHHw)9!F9u)25!}OaL9`+i=|R1*mJ3hh-l zBC+SREixfOkx!#N`&;SXzvS9(ojNvw)3=pb)?s`V|Ms~s(RCk^X$0E z?>1D+U>N)5V4J+>=;a8<_+CG5`pTnG`eF`o&xsu_+ol@CU3PYBvdesY#6`Ybedu<8 zXW>|x=<4x1fWb~l;F$bCGv5j-iNM@20xxst4{3cbU?m$agEr6-H%nG@wmq#lX=obg z6)sCC3Jj-S7Bm~pD$2_4cGLVng%-?s|3@jse=A%5AIrZR-wcA!Ky349lbbzM%fl2G zL`HwJ%S=bO?D3SUii#E+l&sDIK(_cJ8yg#52sEQPr{~oLK=E_mP%#~E@8-|x>2}lx zE!&dVY2`l)Cy&TYi{0SgSuo4}$@gOWiwIoCu_ zM9%QBzdr~3MC&j7emXNSki4@{)5Fr5+jfG;S2`(lEj&6}#}l;^_BdZP3x>nv;^z-Z zzkPbpW5Jyz?%AQCPFXqen6Rg(ryrt zmGH`0TXR$Lz40q3sQh;PgHl#5s{4Bo&!^<%@P4pgLl5zxfWO1;MX$iloR04mGP(^7 zNkKtcb#=29!~z*3Blu$$Gzg1~lq_C387~xj<7pOBgHBwW_S4Ki6fkbz7n-A{6{MSu zv0`Ub_Q(qF>{-w1kH;mFZAX)9DRaog>lnTH8ajk5!SzS{+^OXcZp@Q#XrNN2M_~5* zBfy^@Y-P?Ch<8>_b_qNaT!zbWz=BQq{!;ZjRd+A1;&Tiuzw}VLI7>%m$*fOwV!?TH zOUvz9j%p!DxubGr@V+%RGRuTWkfe%H0=*Y&87R(ItUbe7RN0M<^M5Ellu-dqt}MP2 z`VnE*b4+R{O{dBTD2IOjhIWR<`ke}ZD>5M%wtL{&+js{x!Bh_H{fcmw!~stP1q)pm{UK}gNvDJnywTGO_W&k; z`A|%g<_`H#VA<{{vcYL3&W8AD_9Frc&U;iyPP?Ni=lbr)=1tY>+dQ=EGh~o#6Hz*!58{h<&4Z`?ecQs(H%tLjO)4DtB-bLZ9Uw9EODE1ial#;~MqZKSZ&L(p^@@ zjpQgyz-?e2a$Co3OPF1^{%?+}%WuH#$x>3l{O#KnU|*+y00h-ZTw{$vw$m-eqccJJOGH>1U1f_2J28>eGeA6FP=>Z zM^R`EG|(0HKpEUCEXqFRV4Ldi?|Aye`$J{A9HkTo2M0=RSOSN?$M*r>yliF+n#$K` zs$BxI*=~=uddNyOdE z@*Z30`1lQ(y?qBj3i=@=a+Py&d8(nQN&aZ=6GRRfm1#j4pMtTmj^*6t%l-*foYqZW z@%Q5BizD6rSx@F)bvRld5m6>GBZFuKFau<*Qn+(2FQ2`3;ok;liQhLIdQ#gY-W8l&u&E;tv5*J{#9boahhjI_adPr^DkPxO`( zGvKu$>Umsnv+MX6^96idDsdba8%xm6ie-aiJzUyIzE_3r^N2y*+6p5Xxu<93;rQjS z9yeGe+3V&xdRED6y7rju6iMui_hymQGiVvcIiw|7WBw}0wWs#SuhFqFieDV1d##Bk z!!|U$G^nkuEoy4&Wr3T;3YfZ%IuV*o1x!X!{z(`B?Qweo)LI~R|K1T4Jf2XI*k}?^ zC3RQ|)^PK@q+yuWVxdq`(l;j|-zl2A@xHR7`e^dZc?MZNPRHoE^d|f`kT5PWaV6TZ z`XN-v(#f`Jk<;8vzIpZP2E2OSY#**p!_Ccoc_FkH5k5|ZkZ5U%PYOLed~`YJkB4*K zD;cBnevl_PaeYv08|vdKe%;i{$2gmX;hU15w&Mxyzhga^ddO42dBqo%|E}q?bCh=h zC*geh$IH6LG6Ef1Upz08Njv1F-t8~A!3s|nXtm3YY)^Na%0Dn+j$e!Wd++~Ev1b>* zjc4C__7x9U^gdDvaG&SsRj|ffh5Jas%|MPVCZ+@Qb~#g5$h2_Q5S7L@0g5^~F(smN zW@ZEKeBTJfxO5tXg}L)Ul{?$fY1_!wh8rQ()p;<2i=A-6U>NSFh#n04?rc`2eNbDr%?xtLHDgjapG8XmYFve$tSjC^e zjV<_}l9_zrt5f!~yV?q^7u<68L`fTTZFPD+2&A3O;l#(sU-rgS4ixszo>OgW9VsD3 zBwCZb*pDQjo8`4I2H(QY)PO`$8RK{RzcT)EnXzIBh$xv0Ub3Z%d1yR6UgGaGgtJ!k zeZQz<|=B;R=MpN$r&hsfkxk1R&)rL(#5^D zoW#q70#VzN?JN4mG@;0XazjTw*Fn^5mLbKt^?CZ`jfWU?&0-iI%c;tJi3Sg6$+(dD zjC)whWH!mOh{i&D|I=BfINDKO0Zsq*kcvlCE+c~aUI+ax@JUT+vc4yw`g+XNuSfXa zf{1^$u%K!epsa&f>x(7rz!NtX=M1jff&Sg36<*vg*HyRI4%^uU* zPP_OhOS1h7FWCQ;-BLj_$jYW~6xjzrcbS*%gSg56S!ery3l72mcIEE>ZN~q<6P|+Y Yzqs_M`Io%g0H`U-y^<|^ZtVZR0HQg}P5=M^ diff --git a/icons/mob/roaper.dmi b/icons/mob/roaper.dmi new file mode 100644 index 0000000000000000000000000000000000000000..272251ec8ae71477500d8a295f13e29c32d6c2a9 GIT binary patch literal 4938 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 Date: Fri, 11 Jul 2014 13:12:01 +0930 Subject: [PATCH 3/5] Added paperwork handler, clerical gripper, some other tweaks. --- .../living/silicon/robot/drone/drone_items.dm | 13 ++++++++++ .../mob/living/silicon/robot/robot_items.dm | 25 +++++++++++++++++-- .../mob/living/silicon/robot/robot_modules.dm | 10 +++++--- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7c2dc565a4..dfe1a9db29 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -28,6 +28,19 @@ //Item currently being held. var/obj/item/wrapped = null +/obj/item/weapon/gripper/paperwork + name = "paperwork gripper" + desc = "A simple grasping tool for clerical work." + icon = 'icons/obj/device.dmi' + icon_state = "gripper" + + can_hold = list( + /obj/item/weapon/clipboard, + /obj/item/weapon/paper, + /obj/item/weapon/paper_bundle, + /obj/item/weapon/card/id + ) + /obj/item/weapon/gripper/attack_self(mob/user as mob) if(wrapped) wrapped.attack_self(user) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 00d1b0abf0..0536b07fd4 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -114,7 +114,7 @@ mode = 1 user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'" - return + return // Copied over from paper's rename verb // see code\modules\paperwork\paper.dm line 62 @@ -132,12 +132,33 @@ add_fingerprint(user) return +//TODO: Add prewritten forms to dispense when you work out a good way to store the strings. /obj/item/weapon/form_printer - name = "paperwork printer" + //name = "paperwork printer" + name = "paper dispenser" icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper_bin1" item_state = "sheet-metal" +/obj/item/weapon/form_printer/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + return + +/obj/item/weapon/form_printer/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) + + if(!target || !flag) + return + + if(istype(target,/obj/structure/table)) + deploy_paper(get_turf(target)) + +/obj/item/weapon/form_printer/attack_self(mob/user as mob) + deploy_paper(get_turf(src)) + +/obj/item/weapon/form_printer/proc/deploy_paper(var/turf/T) + T.visible_message("\blue \The [src.loc] dispenses a sheet of crisp white paper.") + new /obj/item/weapon/paper(T) + + //Personal shielding for the combat module. /obj/item/borg/combat/shield name = "personal shielding" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index b1797e6b2a..aa9f5ce958 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -277,7 +277,6 @@ src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) - src.modules += new /obj/item/weapon/pen/robopen(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.matter = 30 @@ -318,6 +317,10 @@ src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/pen/robopen(src) + src.modules += new /obj/item/weapon/form_printer(src) + src.modules += new /obj/item/weapon/gripper/paperwork(src) + + src.emag = new /obj/item/weapon/stamp/denied(src) add_languages(var/mob/living/silicon/robot/R) R.add_language("Sol Common", 1) @@ -344,6 +347,7 @@ src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/storage/bag/ore(src) src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) @@ -430,7 +434,7 @@ /obj/item/proc/is_robot_module() if (!istype(src.loc, /mob/living/silicon/robot)) return 0 - + var/mob/living/silicon/robot/R = src.loc - + return (src in R.module.modules) From 0d21889beea9ca343979ce8d48358e76212f7e6e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 13:50:34 +0930 Subject: [PATCH 4/5] Fixed some bugs, did some testing, moved some procs around for robot functionality. --- .../structures/stool_bed_chair_nest/bed.dm | 16 +++++++++++++++- code/modules/mob/living/silicon/robot/robot.dm | 12 ++++++++++-- .../mob/living/silicon/robot/robot_items.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 2 ++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 985d34d8c0..19bbcf36f4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -71,7 +71,9 @@ "You hear metal clanking") unbuckle() src.add_fingerprint(user) - return + return 1 + + return 0 /obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob) if (!ticker) @@ -112,6 +114,18 @@ icon_state = "down" anchored = 0 +/obj/structure/stool/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/roller_holder)) + if(buckled_mob) + manual_unbuckle() + else + visible_message("[user] collapses \the [src.name].") + new/obj/item/roller(get_turf(src)) + spawn(0) + del(src) + return + ..() + /obj/item/roller name = "roller bed" desc = "A collapsed roller bed that can be carried around." diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 00124ffd63..8d1823f0c5 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -163,7 +163,7 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/list/modules = list("Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Security") + var/list/modules = list("Standard", "Engineering", "Construction", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security") if(crisis && security_level == SEC_LEVEL_RED) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" @@ -189,6 +189,14 @@ module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" + if("Clerical") + module = new /obj/item/weapon/robot_module/clerical(src) + module_sprites["Waitress"] = "Service" + module_sprites["Kent"] = "toiletbot" + module_sprites["Bro"] = "Brobot" + module_sprites["Rich"] = "maximillion" + module_sprites["Default"] = "Service2" + if("Miner") module = new /obj/item/weapon/robot_module/miner(src) module.channels = list("Supply" = 1) @@ -237,7 +245,7 @@ module_sprites["Landmate"] = "landmate" if("Construction") - module = new /obj/item/weapon/robot_module/engineering(src) + module = new /obj/item/weapon/robot_module/construction(src) module.channels = list("Engineering" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Engineering") diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 0536b07fd4..931cb0556b 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -105,7 +105,7 @@ if("Colour") var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow") - if(newcolour) color = newcolour + if(newcolour) colour = newcolour if("Mode") if (mode == 1) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index aa9f5ce958..3ad034666a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -134,6 +134,8 @@ src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" return From d2c57115ed95f982249ecf6fc83994271b5d19e9 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 13:55:21 +0930 Subject: [PATCH 5/5] Added glass to the engineering module. --- code/modules/mob/living/silicon/robot/robot_modules.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 3ad034666a..00caecb8f0 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -180,6 +180,7 @@ stacktypes = list( /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/glass = 50, /obj/item/stack/sheet/rglass = 50, /obj/item/weapon/cable_coil = 50, /obj/item/stack/rods = 15, @@ -209,7 +210,11 @@ M.amount = 50 src.modules += M - var/obj/item/stack/sheet/rglass/cyborg/G = new /obj/item/stack/sheet/rglass/cyborg(src) + var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src) + R.amount = 50 + src.modules += R + + var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src) G.amount = 50 src.modules += G