diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 47a24f192f..f300496aa2 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -203,6 +203,12 @@ var/global/list/PDA_Manifest = list() anchored = 1 unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr +/obj/structure/showcase/sign + name = "WARNING: WILDERNESS" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "wilderness1" + desc = "This appears to be a sign warning people that the other side is dangerous. It also says that NanoTrasen cannot guarantee your safety beyond this point." + /obj/item/mouse_drag_pointer = MOUSE_ACTIVE_POINTER /obj/item/weapon/beach_ball diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index df2387e71f..2f0fce2bd3 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -28,7 +28,10 @@ /obj/random/action_figure = 1, /obj/random/plushie = 1, /obj/item/toy/cultsword = 1, - /obj/item/toy/bouquet/fake = 1 + /obj/item/toy/bouquet/fake = 1, + /obj/item/clothing/accessory/badge/sheriff = 2, + /obj/item/clothing/head/cowboy_hat/small = 2, + /obj/item/toy/stickhorse = 2 ) /obj/machinery/computer/arcade/New() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index b22dc27dba..5cded75805 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -218,6 +218,8 @@ /obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob) add_fingerprint(user) + if(istype(C, /obj/item/taperoll)) + return //Don't open the door if we're putting tape on it to tell people 'don't open the door'. if(operating) return//Already doing something. if(istype(C, /obj/item/weapon/weldingtool) && !repairing) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 3b05f4e27c..ca1fa7b3b1 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -835,6 +835,7 @@ /obj/item/weapon/storage/fancy/cigarettes/luckystars = 5, /obj/item/weapon/storage/fancy/cigarettes/jerichos = 5, /obj/item/weapon/storage/fancy/cigarettes/menthols = 5, + /obj/item/weapon/storage/rollingpapers = 5, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/random = 4) contraband = list(/obj/item/weapon/flame/lighter/zippo = 4) @@ -847,6 +848,7 @@ /obj/item/weapon/storage/fancy/cigarettes/luckystars = 17, /obj/item/weapon/storage/fancy/cigarettes/jerichos = 22, /obj/item/weapon/storage/fancy/cigarettes/menthols = 18, + /obj/item/weapon/storage/rollingpapers = 10, /obj/item/weapon/storage/box/matches = 1, /obj/item/weapon/flame/lighter/random = 2) diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm new file mode 100644 index 0000000000..b6f1915667 --- /dev/null +++ b/code/game/mecha/combat/gorilla.dm @@ -0,0 +1,213 @@ +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon + name = "8.8cm KwK 47" + desc = "Precision German engineering!" // Why would you ever take this off the mech, anyway? + icon_state = "mecha_uac2" + equip_cooldown = 60 // 6 seconds + projectile = /obj/item/projectile/bullet/cannon + fire_sound = 'sound/weapons/cannon.ogg' + projectiles = 1 + projectile_energy_cost = 1000 + salvageable = 0 // We don't want players ripping this off a dead mech. Could potentially be a prize for beating it if Devs bless me and someone offers a nerf idea. + +/obj/item/projectile/bullet/cannon + name ="armor-piercing shell" + icon = 'icons/obj/projectiles.dmi' + icon_state = "shell" + damage = 1000 // In order to 1-hit any other mech and royally fuck anyone unfortunate enough to get in the way. + +/obj/item/projectile/bullet/cannon/on_hit(var/atom/target, var/blocked = 0) + explosion(target, 0, 0, 2, 4) + return 1 + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon/weak + name = "8.8 cm KwK 36" + equip_cooldown = 120 // 12 seconds. + projectile = /obj/item/projectile/bullet/cannon/weak + projectile_energy_cost = 400 + salvageable = 1 + +/obj/item/projectile/bullet/cannon/weak + name ="canister shell" + icon_state = "canister" + damage = 120 //Do not get fucking shot. + +/* // GLITCHY UND LAGGY. Will later look into fixing. +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mg42 + name = "Maschinengewehr 60" + icon_state = "mecha_uac2" + equip_cooldown = 10 + projectile = /obj/item/projectile/bullet/midbullet2 + fire_sound = 'sound/weapons/mg42.ogg' + projectiles = 1000 + projectiles_per_shot = 5 + deviation = 0.3 + projectile_energy_cost = 20 + fire_cooldown = 1 + salvageable = 0 // We don't want players ripping this off a dead mech. +*/ + +/obj/effect/decal/mecha_wreckage/gorilla + name = "Gorilla wreckage" + desc = "... Blitzkrieg?" + icon = 'icons/mecha/mecha64x64.dmi' + icon_state = "pzrwreck" + layer = 4 // so it overlaps other people + pixel_x = -16 + anchored = 1 // It's fucking huge. You aren't moving it. + +/obj/mecha/combat/gorilla + name = "Gorilla" + desc = "Blitzkrieg!" //stop using all caps in item descs i will fight you. its redundant with the bold. + icon = 'icons/mecha/mecha64x64.dmi' + icon_state = "pzrmech" + initial_icon = "pzrmech" + pixel_x = -16 + step_in = 10 + health = 5000 + opacity = 0 // Because there's big tall legs to look through. Also it looks fucky if this is set to 1. + deflect_chance = 50 + damage_absorption = list("brute"=0.1,"fire"=0.8,"bullet"=0.1,"laser"=0.6,"energy"=0.7,"bomb"=0.7) //values show how much damage will pass through, not how much will be absorbed. + max_temperature = 35000 //Just a bit better than the Durand. + infra_luminosity = 3 + var/zoom = 0 + var/smoke = 5 + var/smoke_ready = 1 + var/smoke_cooldown = 100 + var/datum/effect/effect/system/smoke_spread/smoke_system = new + wreckage = /obj/effect/decal/mecha_wreckage/gorilla + add_req_access = 0 + internal_damage_threshold = 25 + force = 60 + max_equip = 5 + +/obj/mecha/combat/gorilla/New() + ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply. + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon/weak(src) //Saves energy, I suppose. Anti-infantry. + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src) + ME.attach(src) + src.smoke_system.set_up(3, 0, src) + src.smoke_system.attach(src) + return + +/obj/mecha/combat/gorilla/mechstep(direction) + var/result = step(src,direction) + playsound(src,"mechstep",40,1) + return result + +/obj/mecha/combat/gorilla/mechturn(direction) + dir = direction + playsound(src,"mechstep",40,1) + + +/obj/mecha/combat/gorilla/relaymove(mob/user,direction) + if(user != src.occupant) + user.loc = get_turf(src) + to_chat(user, "You climb out from [src]") + return 0 + if(!can_move) + return 0 + if(zoom) + if(world.time - last_message > 20) + src.occupant_message("Unable to move while in zoom mode.") + last_message = world.time + return 0 + if(connected_port) + if(world.time - last_message > 20) + src.occupant_message("Unable to move while connected to the air system port") + last_message = world.time + return 0 + if(state || !has_charge(step_energy_drain)) + return 0 + var/tmp_step_in = step_in + var/tmp_step_energy_drain = step_energy_drain + var/move_result = 0 + if(internal_damage&MECHA_INT_CONTROL_LOST) + move_result = mechsteprand() + else if(src.dir!=direction) + move_result = mechturn(direction) + else + move_result = mechstep(direction) + if(move_result) + if(istype(src.loc, /turf/space)) + if(!src.check_for_support()) + src.pr_inertial_movement.start(list(src,direction)) + can_move = 0 + spawn(tmp_step_in) can_move = 1 + use_power(tmp_step_energy_drain) + return 1 + return 0 + +/obj/mecha/combat/gorilla/verb/smoke() + set category = "Exosuit Interface" + set name = "Smoke" + set src = usr.loc + set popup_menu = 0 + if(usr!=src.occupant) + return + if(smoke_ready && smoke>0) + src.smoke_system.start() + smoke-- + smoke_ready = 0 + spawn(smoke_cooldown) + smoke_ready = 1 + return + +/obj/mecha/combat/gorilla/verb/zoom() + set category = "Exosuit Interface" + set name = "Zoom" + set src = usr.loc + set popup_menu = 0 + if(usr!=src.occupant) + return + if(src.occupant.client) + src.zoom = !src.zoom + src.log_message("Toggled zoom mode.") + src.occupant_message("Zoom mode [zoom?"en":"dis"]abled.") + if(zoom) + src.occupant.client.view = 12 + playsound(src.occupant, 'sound/mecha/imag_enh.ogg',50) + else + src.occupant.client.view = world.view//world.view - default mob view size + return + + +/obj/mecha/combat/gorilla/go_out() + if(src.occupant && src.occupant.client) + src.occupant.client.view = world.view + src.zoom = 0 + ..() + return + + +/obj/mecha/combat/gorilla/get_stats_part() + var/output = ..() + output += {"Smoke: [smoke]"} + return output + + +/obj/mecha/combat/gorilla/get_commands() + var/output = {"
+
Special
+ +
+ "} + output += ..() + return output + +/obj/mecha/combat/gorilla/Topic(href, href_list) + ..() + if (href_list["smoke"]) + src.smoke() + if (href_list["toggle_zoom"]) + src.zoom() + return \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/unused_tools.dm b/code/game/mecha/equipment/tools/unused_tools.dm deleted file mode 100644 index c7ef794c4e..0000000000 --- a/code/game/mecha/equipment/tools/unused_tools.dm +++ /dev/null @@ -1,27 +0,0 @@ - - - -/****** Do not tick this file in without looking over this code first ******/ - - - - -/* -/obj/item/mecha_parts/mecha_equipment/book_stocker - - action(var/mob/target) - if(!istype(target)) - return - if(target.search_contents_for(/obj/item/book/WGW)) - target.gib() - target.client.gib() - target.client.mom.monkeyize() - target.client.mom.gib() - for(var/mob/M in range(target, 1000)) - M.gib() - explosion(target.loc,100000,100000,100000) - usr.gib() - world.Reboot() - return 1 - -*/ diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 50012fe95c..80b417da22 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -117,46 +117,41 @@ projectile = /obj/item/projectile/beam/stun fire_sound = 'sound/weapons/Taser.ogg' -/* + /obj/item/mecha_parts/mecha_equipment/weapon/honker name = "sound emission device" icon_state = "mecha_honker" energy_drain = 300 equip_cooldown = 150 - range = MELEE|RANGED origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 4, TECH_ILLEGAL = 1) - var/ear_safety = 0 - if(iscarbon(M)) +/obj/item/mecha_parts/mecha_equipment/honker/action(target) + if(!chassis) + return 0 + if(energy_drain && chassis.get_charge() < energy_drain) + return 0 + if(!equip_ready) + return 0 + + playsound(chassis, 'sound/effects/bang.ogg', 30, 1, 30) + chassis.occupant_message("You emit a high-pitched noise from the mech.") + for(var/mob/living/carbon/M in ohearers(6, chassis)) + if(istype(M, /mob/living/carbon/human)) + var/ear_safety = 0 ear_safety = M.get_ear_protection() - - action(target) - if(!chassis) - return 0 - if(energy_drain && chassis.get_charge() < energy_drain) - return 0 - if(!equip_ready) - return 0 - - playsound(chassis, 'sound/effects/bang.ogg', 30, 1, 30) - chassis.occupant_message("You emit a high-pitched noise from the mech.") - for(var/mob/living/carbon/M in ohearers(6, chassis)) - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(ear_safety > 0) - return - to_chat(M, "\Your ears feel like they're bleeding!") - playsound(M, 'sound/effects/bang.ogg', 70, 1, 30) - M.sleeping = 0 - M.ear_deaf += 30 - M.ear_damage += rand(5, 20) - M.Weaken(3) - M.Stun(5) - chassis.use_power(energy_drain) - log_message("Used a sound emission device.") - do_after_cooldown() - return -*/ + if(ear_safety > 0) + return + to_chat(M, "Your ears feel like they're bleeding!") + playsound(M, 'sound/effects/bang.ogg', 70, 1, 30) + M.sleeping = 0 + M.ear_deaf += 30 + M.ear_damage += rand(5, 20) + M.Weaken(3) + M.Stun(5) + chassis.use_power(energy_drain) + log_message("Used a sound emission device.") + do_after_cooldown() + return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic name = "general ballisic weapon" @@ -361,4 +356,4 @@ if(!action_checks(user) || !active) return user.electrocute_act(shock_damage, src) - return chassis.dynattackby(W,user) \ No newline at end of file + return chassis.dynattackby(W,user) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 2cc8b7a64f..d6dea13c51 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -71,6 +71,7 @@ /obj/effect/overlay/snow/floor icon_state = "snowfloor" layer = 2.01 //Just above floor + mouse_opacity = 0 //Don't block underlying tile interactions /obj/effect/overlay/snow/floor/edges icon_state = "snow_edges" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 6928889b59..31ce05c43b 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1247,20 +1247,17 @@ var/global/list/obj/item/device/pda/PDAs = list() if(issilicon(usr)) return - if (can_use(usr) && !isnull(cartridge)) - var/turf/T = get_turf(src) - cartridge.loc = T - if (ismob(loc)) + if(can_use(usr) && !isnull(cartridge)) + cartridge.forceMove(get_turf(src)) + if(ismob(loc)) var/mob/M = loc M.put_in_hands(cartridge) - else - cartridge.loc = get_turf(src) mode = 0 scanmode = 0 if (cartridge.radio) cartridge.radio.hostpda = null - cartridge = null to_chat(usr, "You remove \the [cartridge] from the [name].") + cartridge = null else to_chat(usr, "You cannot do this while restrained.") diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index b77d73a262..4b088f51b8 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -265,8 +265,6 @@ var/list/civilian_cartridges = list( if(loc) var/obj/item/PDA = loc var/mob/user = PDA.fingerprintslast - if(istype(PDA.loc,/mob/living)) - name = PDA.loc log_admin("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]") message_admins("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]") diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 3781d6a1c3..ab475cdca9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -95,7 +95,7 @@ HALOGEN COUNTER - Radcount on mobs else dat += " [capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : 0]" dat += "[(org.status & ORGAN_BLEEDING)?"\[Bleeding\]":""] - " - dat += "[(org.burn_dam > 0) ? "[org.burn_dam]" : 0]" + dat += "[(org.burn_dam > 0) ? "[org.burn_dam]" : 0]
" else dat += " Limbs are OK.
" diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm index 41e0221cf7..fc6352de29 100644 --- a/code/game/objects/items/devices/translator.dm +++ b/code/game/objects/items/devices/translator.dm @@ -4,7 +4,7 @@ desc = "This handy device appears to translate the languages it hears into onscreen text for a user." icon = 'icons/obj/device.dmi' icon_state = "translator" - w_class = ITEMSIZE_NORMAL //VOREStation Edit + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) var/mult_icons = 1 //Changes sprite when it translates var/visual = 1 //If you need to see to get the message diff --git a/code/game/objects/items/stacks/fifty_spawner.dm b/code/game/objects/items/stacks/fifty_spawner.dm index 1977427ebb..0be33e5829 100644 --- a/code/game/objects/items/stacks/fifty_spawner.dm +++ b/code/game/objects/items/stacks/fifty_spawner.dm @@ -8,13 +8,17 @@ var/obj/item/stack/type_to_spawn = null /obj/fiftyspawner/New() - //spawns the 50-stack and qdels self - ..() -// var/obj_path = text2path("/obj/item/stack/[material]") - var/obj/item/stack/M = new type_to_spawn(src.loc) - M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty - M.update_icon() // Some stacks have different sprites depending on how full they are. - qdel(src) + spawn() + //spawns the 50-stack and qdels self + ..() + if(istype(src.loc, /obj/structure/loot_pile)) //Spawning from a lootpile is weird, need to wait until we're out of it to do our work. + while(istype(src.loc, /obj/structure/loot_pile)) + sleep(1) + // var/obj_path = text2path("/obj/item/stack/[material]") + var/obj/item/stack/M = new type_to_spawn(src.loc) + M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty + M.update_icon() // Some stacks have different sprites depending on how full they are. + qdel(src) /obj/fiftyspawner/rods name = "stack of rods" //this needs to be defined for cargo diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index c86993fa31..168d7708bf 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -17,6 +17,7 @@ * Plushies * Toy cult sword * Bouquets + Stick Horse */ @@ -503,207 +504,324 @@ /* * Action figures */ - /obj/item/toy/figure - name = "Completely Glitched action figure" - desc = "A \"Space Life\" brand... wait, what the hell is this thing? It seems to be requesting the sweet release of death." - icon_state = "assistant" + name = "Non-Specific Action Figure action figure" + desc = "A \"Space Life\" brand... wait, what the hell is this thing?" icon = 'icons/obj/toy.dmi' + icon_state = "nuketoy" + var/cooldown = 0 + var/toysay = "What the fuck did you do?" + +/obj/item/toy/figure/New() + ..() + desc = "A \"Space Life\" brand [name]" + +/obj/item/toy/figure/attack_self(mob/user as mob) + if(cooldown < world.time) + cooldown = (world.time + 30) //3 second cooldown + user.visible_message("The [src] says \"[toysay]\".") + playsound(user, 'sound/machines/click.ogg', 20, 1) /obj/item/toy/figure/cmo name = "Chief Medical Officer action figure" desc = "A \"Space Life\" brand Chief Medical Officer action figure." icon_state = "cmo" + toysay = "Suit sensors!" /obj/item/toy/figure/assistant name = "Assistant action figure" desc = "A \"Space Life\" brand Assistant action figure." icon_state = "assistant" + toysay = "Grey tide station wide!" /obj/item/toy/figure/atmos name = "Atmospheric Technician action figure" desc = "A \"Space Life\" brand Atmospheric Technician action figure." icon_state = "atmos" + toysay = "Glory to Atmosia!" /obj/item/toy/figure/bartender name = "Bartender action figure" desc = "A \"Space Life\" brand Bartender action figure." icon_state = "bartender" + toysay = "Where's my monkey?" /obj/item/toy/figure/borg name = "Drone action figure" desc = "A \"Space Life\" brand Drone action figure." icon_state = "borg" + toysay = "I. LIVE. AGAIN." /obj/item/toy/figure/gardener name = "Gardener action figure" desc = "A \"Space Life\" brand Gardener action figure." icon_state = "botanist" + toysay = "Dude, I see colors..." /obj/item/toy/figure/captain name = "Colony Director action figure" desc = "A \"Space Life\" brand Colony Director action figure." icon_state = "captain" + toysay = "How do I open this display case?" /obj/item/toy/figure/cargotech name = "Cargo Technician action figure" desc = "A \"Space Life\" brand Cargo Technician action figure." icon_state = "cargotech" + toysay = "For Cargonia!" /obj/item/toy/figure/ce name = "Chief Engineer action figure" desc = "A \"Space Life\" brand Chief Engineer action figure." icon_state = "ce" + toysay = "Wire the solars!" /obj/item/toy/figure/chaplain name = "Chaplain action figure" desc = "A \"Space Life\" brand Chaplain action figure." icon_state = "chaplain" + toysay = "Gods make me a killing machine please!" /obj/item/toy/figure/chef name = "Chef action figure" desc = "A \"Space Life\" brand Chef action figure." icon_state = "chef" + toysay = "I swear it's not human meat." /obj/item/toy/figure/chemist name = "Chemist action figure" desc = "A \"Space Life\" brand Chemist action figure." icon_state = "chemist" + toysay = "Get your pills!" /obj/item/toy/figure/clown name = "Clown action figure" desc = "A \"Space Life\" brand Clown action figure." icon_state = "clown" + toysay = "Honk!" /obj/item/toy/figure/corgi name = "Corgi action figure" desc = "A \"Space Life\" brand Corgi action figure." icon_state = "ian" + toysay = "Arf!" /obj/item/toy/figure/detective name = "Detective action figure" desc = "A \"Space Life\" brand Detective action figure." icon_state = "detective" + toysay = "This airlock has grey jumpsuit and insulated glove fibers on it." /obj/item/toy/figure/dsquad name = "Space Commando action figure" desc = "A \"Space Life\" brand Space Commando action figure." icon_state = "dsquad" + toysay = "Eliminate all threats!" /obj/item/toy/figure/engineer name = "Engineer action figure" desc = "A \"Space Life\" brand Engineer action figure." icon_state = "engineer" + toysay = "Oh god, the engine is gonna go!" /obj/item/toy/figure/geneticist name = "Geneticist action figure" desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued." icon_state = "geneticist" + toysay = "I'm not qualified for this job." /obj/item/toy/figure/hop name = "Head of Personnel action figure" desc = "A \"Space Life\" brand Head of Personnel action figure." icon_state = "hop" + toysay = "Giving out all access!" /obj/item/toy/figure/hos name = "Head of Security action figure" desc = "A \"Space Life\" brand Head of Security action figure." icon_state = "hos" + toysay = "I'm here to win, anything else is secondary." /obj/item/toy/figure/qm name = "Quartermaster action figure" desc = "A \"Space Life\" brand Quartermaster action figure." icon_state = "qm" + toysay = "Hail Cargonia!" /obj/item/toy/figure/janitor name = "Janitor action figure" desc = "A \"Space Life\" brand Janitor action figure." icon_state = "janitor" + toysay = "Look at the signs, you idiot." /obj/item/toy/figure/agent name = "Internal Affairs Agent action figure" desc = "A \"Space Life\" brand Internal Affairs Agent action figure." icon_state = "agent" + toysay = "Standard Operating Procedure says they're guilty! Hacking is proof they're an Enemy of the Corporation!" /obj/item/toy/figure/librarian name = "Librarian action figure" desc = "A \"Space Life\" brand Librarian action figure." icon_state = "librarian" + toysay = "One day while..." /obj/item/toy/figure/md name = "Medical Doctor action figure" desc = "A \"Space Life\" brand Medical Doctor action figure." icon_state = "md" + toysay = "The patient is already dead!" /obj/item/toy/figure/mime name = "Mime action figure" desc = "A \"Space Life\" brand Mime action figure." icon_state = "mime" + toysay = "..." /obj/item/toy/figure/miner name = "Shaft Miner action figure" desc = "A \"Space Life\" brand Shaft Miner action figure." icon_state = "miner" + toysay = "Oh god, it's eating my intestines!" /obj/item/toy/figure/ninja name = "Space Ninja action figure" desc = "A \"Space Life\" brand Space Ninja action figure." icon_state = "ninja" + toysay = "Oh god! Stop shooting, I'm friendly!" /obj/item/toy/figure/wizard name = "Wizard action figure" desc = "A \"Space Life\" brand Wizard action figure." icon_state = "wizard" + toysay = "Ei Nath!" /obj/item/toy/figure/rd name = "Research Director action figure" desc = "A \"Space Life\" brand Research Director action figure." icon_state = "rd" + toysay = "Blowing all of the borgs!" /obj/item/toy/figure/roboticist name = "Roboticist action figure" desc = "A \"Space Life\" brand Roboticist action figure." icon_state = "roboticist" + toysay = "He asked to be borged!" /obj/item/toy/figure/scientist name = "Scientist action figure" desc = "A \"Space Life\" brand Scientist action figure." icon_state = "scientist" + toysay = "Someone else must have made those bombs!" /obj/item/toy/figure/syndie name = "Doom Operative action figure" desc = "A \"Space Life\" brand Doom Operative action figure." icon_state = "syndie" + toysay = "Get that fucking disk!" /obj/item/toy/figure/secofficer name = "Security Officer action figure" desc = "A \"Space Life\" brand Security Officer action figure." icon_state = "secofficer" + toysay = "I am the law!" + +/obj/item/toy/figure/virologist + name = "Virologist action figure" + desc = "A \"Space Life\" brand Virologist action figure." + icon_state = "virologist" + toysay = "The cure is potassium!" /obj/item/toy/figure/warden name = "Warden action figure" desc = "A \"Space Life\" brand Warden action figure." icon_state = "warden" + toysay = "Execute him for breaking in!" /obj/item/toy/figure/psychologist name = "Psychologist action figure" desc = "A \"Space Life\" brand Psychologist action figure." icon_state = "psychologist" + toysay = "The analyzer says you're fine!" /obj/item/toy/figure/paramedic name = "Paramedic action figure" desc = "A \"Space Life\" brand Paramedic action figure." icon_state = "paramedic" + toysay = "WHERE ARE YOU??" /obj/item/toy/figure/ert name = "Emergency Response Team Commander action figure" desc = "A \"Space Life\" brand Emergency Response Team Commander action figure." icon_state = "ert" + toysay = "We're probably the good guys!" /* * Plushies */ +/* + * Carp plushie + */ + +/obj/item/toy/plushie/carp + name = "space carp plushie" + desc = "An adorable stuffed toy that resembles a space carp." + icon = 'icons/obj/toy.dmi' + icon_state = "plushie/carp" + attack_verb = list("bitten", "eaten", "fin slapped") + var/bitesound = 'sound/weapons/bite.ogg' + +// Attack mob +/obj/item/toy/plushie/carp/attack(mob/M as mob, mob/user as mob) + playsound(loc, bitesound, 20, 1) // Play bite sound in local area + return ..() + +// Attack self +/obj/item/toy/plushie/carp/attack_self(mob/user as mob) + playsound(src.loc, bitesound, 20, 1) + return ..() + + +/obj/random/carp_plushie + name = "Random Carp Plushie" + desc = "This is a random plushie" + icon = 'icons/obj/toy.dmi' + icon_state = "plushie/carp" + +/obj/random/carp_plushie/item_to_spawn() + return pick(typesof(/obj/item/toy/plushie/carp)) //can pick any carp plushie, even the original. + +/obj/item/toy/plushie/carp/ice + icon_state = "icecarp" + +/obj/item/toy/plushie/carp/silent + icon_state = "silentcarp" + +/obj/item/toy/plushie/carp/electric + icon_state = "electriccarp" + +/obj/item/toy/plushie/carp/gold + icon_state = "goldcarp" + +/obj/item/toy/plushie/carp/toxin + icon_state = "toxincarp" + +/obj/item/toy/plushie/carp/dragon + icon_state = "dragoncarp" + +/obj/item/toy/plushie/carp/pink + icon_state = "pinkcarp" + +/obj/item/toy/plushie/carp/candy + icon_state = "candycarp" + +/obj/item/toy/plushie/carp/nebula + icon_state = "nebulacarp" + +/obj/item/toy/plushie/carp/void + icon_state = "voidcarp" + //Large plushies. /obj/structure/plushie name = "generic plush" @@ -726,6 +844,7 @@ user.visible_message("\The [user] pokes the [src].","You poke the [src].") visible_message("[src] says, \"[phrase]\"") + /obj/structure/plushie/ian name = "plush corgi" desc = "A plushie of an adorable corgi! Don't you just want to hug it and squeeze it and call it \"Ian\"?" @@ -741,7 +860,7 @@ /obj/structure/plushie/carp name = "plush carp" desc = "A plushie of an elated carp! Straight from the wilds of the Vir frontier, now right here in your hands." - icon_state = "carpplushie" + icon_state = "plushie/carp" phrase = "Glorf!" /obj/structure/plushie/beepsky @@ -787,6 +906,12 @@ to_chat(M, "You name the plushie [input], giving it a hug for good luck.") return 1 +/obj/item/toy/plushie/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/toy/plushie) || istype(I, /obj/item/organ/external/head)) + user.visible_message("[user] makes \the [I] kiss \the [src]!.", \ + "You make \the [I] kiss \the [src]!.") + return ..() + /obj/item/toy/plushie/nymph name = "diona nymph plush" desc = "A plushie of an adorable diona nymph! While its level of self-awareness is still being debated, its level of cuteness is not." @@ -817,6 +942,96 @@ desc = "A farwa plush doll. It's soft and comforting!" icon_state = "farwaplushie" +/obj/item/toy/plushie/corgi + name = "corgi plushie" + icon_state = "corgi" + +/obj/item/toy/plushie/girly_corgi + name = "corgi plushie" + icon_state = "girlycorgi" + +/obj/item/toy/plushie/robo_corgi + name = "borgi plushie" + icon_state = "robotcorgi" + +/obj/item/toy/plushie/octopus + name = "octopus plushie" + icon_state = "loveable" + +/obj/item/toy/plushie/face_hugger + name = "facehugger plushie" + icon_state = "huggable" + +//foxes are basically the best + +/obj/item/toy/plushie/red_fox + name = "red fox plushie" + icon_state = "redfox" + +/obj/item/toy/plushie/black_fox + name = "black fox plushie" + icon_state = "blackfox" + +/obj/item/toy/plushie/marble_fox + name = "marble fox plushie" + icon_state = "marblefox" + +/obj/item/toy/plushie/blue_fox + name = "blue fox plushie" + icon_state = "bluefox" + +/obj/item/toy/plushie/orange_fox + name = "orange fox plushie" + icon_state = "orangefox" + +/obj/item/toy/plushie/coffee_fox + name = "coffee fox plushie" + icon_state = "coffeefox" + +/obj/item/toy/plushie/pink_fox + name = "pink fox plushie" + icon_state = "pinkfox" + +/obj/item/toy/plushie/purple_fox + name = "purple fox plushie" + icon_state = "purplefox" + +/obj/item/toy/plushie/crimson_fox + name = "crimson fox plushie" + icon_state = "crimsonfox" + +/obj/item/toy/plushie/deer + name = "deer plushie" + icon_state = "deer" + +/obj/item/toy/plushie/black_cat + name = "black cat plushie" + icon_state = "blackcat" + +/obj/item/toy/plushie/grey_cat + name = "grey cat plushie" + icon_state = "greycat" + +/obj/item/toy/plushie/white_cat + name = "white cat plushie" + icon_state = "whitecat" + +/obj/item/toy/plushie/orange_cat + name = "orange cat plushie" + icon_state = "orangecat" + +/obj/item/toy/plushie/siamese_cat + name = "siamese cat plushie" + icon_state = "siamesecat" + +/obj/item/toy/plushie/tabby_cat + name = "tabby cat plushie" + icon_state = "tabbycat" + +/obj/item/toy/plushie/tuxedo_cat + name = "tuxedo cat plushie" + icon_state = "tuxedocat" + /obj/item/toy/plushie/therapy/red name = "red therapy doll" desc = "A toy for therapeutic and recreational purposes. This one is red." @@ -886,6 +1101,147 @@ name = "plastic bouquet" desc = "A cheap plastic bouquet of flowers. Smells like cheap, toxic plastic." +/obj/item/toy/stickhorse + name = "stick horse" + desc = "A pretend horse on a stick for any aspiring little cowboy to ride." + icon = 'icons/obj/toy.dmi' + icon_state = "stickhorse" + w_class = ITEMSIZE_LARGE + +////////////////////////////////////////////////////// +// Magic 8-Ball / Conch // +////////////////////////////////////////////////////// + +/obj/item/toy/eight_ball + name = "\improper Magic 8-Ball" + desc = "Mystical! Magical! Ages 8+!" + icon = 'icons/obj/toy.dmi' + icon_state = "eight-ball" + var/use_action = "shakes the ball" + var/cooldown = 0 + var/list/possible_answers = list("Definitely.", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") + +/obj/item/toy/eight_ball/attack_self(mob/user as mob) + if(!cooldown) + var/answer = pick(possible_answers) + user.visible_message("[user] focuses on their question and [use_action]...") + user.visible_message("The [src] says \"[answer]\"") + spawn(30) + cooldown = 0 + return + +/obj/item/toy/eight_ball/conch + name = "Magic Conch shell" + desc = "All hail the Magic Conch!" + icon_state = "conch" + use_action = "pulls the string" + possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.") + +// DND Character minis. Use the naming convention (type)character for the icon states. +/obj/item/toy/character + icon = 'icons/obj/toy.dmi' + w_class = ITEMSIZE_SMALL + pixel_z = 5 + +/obj/item/toy/character/alien + name = "xenomorph xiniature" + desc = "A miniature xenomorph. Scary!" + icon_state = "aliencharacter" +/obj/item/toy/character/cleric + name = "cleric miniature" + desc = "A wee little cleric, with his wee little staff." + icon_state = "clericcharacter" +/obj/item/toy/character/warrior + name = "warrior miniature" + desc = "That sword would make a decent toothpick." + icon_state = "warriorcharacter" +/obj/item/toy/character/thief + name = "thief miniature" + desc = "Hey, where did my wallet go!?" + icon_state = "thiefcharacter" +/obj/item/toy/character/wizard + name = "wizard miniature" + desc = "MAGIC!" + icon_state = "wizardcharacter" +/obj/item/toy/character/voidone + name = "void one miniature" + desc = "The dark lord has risen!" + icon_state = "darkmastercharacter" +/obj/item/toy/character/lich + name = "lich miniature" + desc = "Murderboner extraordinaire." + icon_state = "lichcharacter" +/obj/item/weapon/storage/box/characters + name = "box of miniatures" + desc = "The nerd's best friends." + icon_state = "box" +/obj/item/weapon/storage/box/characters/starts_with = list( +// /obj/item/toy/character/alien, + /obj/item/toy/character/cleric, + /obj/item/toy/character/warrior, + /obj/item/toy/character/thief, + /obj/item/toy/character/wizard, + /obj/item/toy/character/voidone, + /obj/item/toy/character/lich + ) + +/obj/item/toy/AI + name = "toy AI" + desc = "A little toy model AI core!"// with real law announcing action!" //Alas, requires a rewrite of how ion laws work. + icon = 'icons/obj/toy.dmi' + icon_state = "AI" + w_class = ITEMSIZE_SMALL + var/cooldown = 0 +/* +/obj/item/toy/AI/attack_self(mob/user) + if(!cooldown) //for the sanity of everyone + var/message = generate_ion_law() + to_chat(user, "You press the button on [src].") + playsound(user, 'sound/machines/click.ogg', 20, 1) + visible_message("[message]") + cooldown = 1 + spawn(30) cooldown = 0 + return + ..() +*/ +/obj/item/toy/owl + name = "owl action figure" + desc = "An action figure modeled after 'The Owl', defender of justice." + icon = 'icons/obj/toy.dmi' + icon_state = "owlprize" + w_class = ITEMSIZE_SMALL + var/cooldown = 0 + +/obj/item/toy/owl/attack_self(mob/user) + if(!cooldown) //for the sanity of everyone + var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!") + to_chat(user, "You pull the string on the [src].") + //playsound(user, 'sound/misc/hoot.ogg', 25, 1) + visible_message("[message]") + cooldown = 1 + spawn(30) cooldown = 0 + return + ..() + +/obj/item/toy/griffin + name = "griffin action figure" + desc = "An action figure modeled after 'The Griffin', criminal mastermind." + icon = 'icons/obj/toy.dmi' + icon_state = "griffinprize" + w_class = ITEMSIZE_SMALL + var/cooldown = 0 + +/obj/item/toy/griffin/attack_self(mob/user) + if(!cooldown) //for the sanity of everyone + var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!") + to_chat(user, "You pull the string on the [src].") + //playsound(user, 'sound/misc/caw.ogg', 25, 1) + visible_message("[message]") + cooldown = 1 + spawn(30) cooldown = 0 + return + ..() + /* NYET. /obj/item/weapon/toddler icon_state = "toddler" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index c8d4eed3ad..729ef1d066 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -6,6 +6,7 @@ MATCHES CIGARETTES CIGARS SMOKING PIPES +CUSTOM CIGS CHEAP LIGHTERS ZIPPO @@ -454,6 +455,41 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = "cobpipe" chem_volume = 35 +/////////////// +//CUSTOM CIGS// +/////////////// +//and by custom cigs i mean craftable joints. smoke weed every day + +/obj/item/clothing/mask/smokable/cigarette/joint + name = "joint" + desc = "This probably shouldn't ever show up." + icon_state = "joint" + max_smoketime = 500 + smoketime = 500 + nicotine_amt = 0 + +/obj/item/weapon/rollingpaper + name = "rolling paper" + desc = "A small, thin piece of easily flammable paper, commonly used for rolling and smoking various dried plants." + icon = 'icons/obj/cigarettes.dmi' + icon_state = "cig paper" + +/obj/item/weapon/rollingpaper/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/reagent_containers/food/snacks)) + var/obj/item/weapon/reagent_containers/food/snacks/grown/G = W + if (!G.dry) + user << "[G] must be dried before you roll it into [src]." + return + var/obj/item/clothing/mask/smokable/cigarette/joint/J = new /obj/item/clothing/mask/smokable/cigarette/joint(user.loc) + to_chat(usr,"You roll the [G.name] into a joint!") + J.add_fingerprint(user) + if(G.reagents) + G.reagents.trans_to_obj(J, G.reagents.total_volume) + J.name = "[G.name] joint" + J.desc = "A joint lovingly rolled and filled with [G.name]. Blaze it." + qdel(G) + qdel(src) + ///////// //ZIPPO// ///////// diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 92519a0ee2..febde75f68 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -67,8 +67,8 @@ if(istype(M,/mob/living)) var/mob/living/L = M L.apply_effect(rand(5,20), IRRADIATE, check_protection = 0) - L.apply_damage(max(2,L.getCloneLoss()), CLONE) //VOREStation Add - Enjoy. - + L.apply_damage(max(2,L.getCloneLoss()), CLONE) + if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed if (buf.types & DNA2_BUF_UI) if (!block) //isolated block? diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index aab967fbbe..2568e9dc61 100644 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -148,7 +148,7 @@ job_access_type = /datum/job/captain /obj/item/weapon/card/id/gold/captain/spare - name = "colony director's spare ID" + name = "\improper Colony Director's spare ID" desc = "The spare ID of the High Lord himself." registered_name = "Colony Director" job_access_type = /datum/job/captain @@ -411,4 +411,4 @@ desc = "An identification card of some sort. It does not look like it is issued by NT." icon_state = "permit" primary_color = rgb(142,94,0) - secondary_color = rgb(191,159,95) \ No newline at end of file + secondary_color = rgb(191,159,95) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index d28779fc08..53a6de9564 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -452,6 +452,7 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/weapon/implant/death_alarm name = "death alarm implant" desc = "An alarm which monitors host vital signs and transmits a radio message upon death." + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 2, TECH_DATA = 1) var/mobname = "Will Robinson" /obj/item/weapon/implant/death_alarm/get_data() @@ -535,6 +536,7 @@ the implant may become unstable and either pre-maturely inject the subject or si icon_state = "implant_evil" var/activation_emote = "sigh" var/obj/item/scanned = null + origin_tech = list(TECH_MATERIAL = 4, TECH_BIO = 2, TECH_ILLEGAL = 2) /obj/item/weapon/implant/compressed/get_data() var/dat = {" diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 8985f85bac..c7212c336d 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -20,6 +20,7 @@ desc = "To keep the rain off you. Use with caution on windy days." icon = 'icons/obj/items.dmi' icon_state = "umbrella_closed" + addblends = "umbrella_closed_a" flags = CONDUCT slot_flags = SLOT_BELT force = 5 @@ -29,7 +30,6 @@ /obj/item/weapon/melee/umbrella/New() ..() - color = "#"+get_random_colour() update_icon() /obj/item/weapon/melee/umbrella/attack_self() @@ -38,10 +38,16 @@ /obj/item/weapon/melee/umbrella/proc/toggle_umbrella() open = !open icon_state = "umbrella_[open ? "open" : "closed"]" + addblends = icon_state + "_a" item_state = icon_state update_icon() if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc H.update_inv_l_hand(0) H.update_inv_r_hand() + ..() + +// Randomizes color +/obj/item/weapon/melee/umbrella/random/New() + color = "#"+get_random_colour() ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index a355be251a..3bb0c89bdc 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -17,9 +17,9 @@ var/turf/T = get_turf(src) if(!T) return - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in T - if(airlock) - afterattack(airlock, null, TRUE) + var/obj/machinery/door/door = locate(/obj/machinery/door) in T + if((door == /obj/machinery/door/airlock) || (door == /obj/machinery/door/firedoor)) + afterattack(door, null, TRUE) return INITIALIZE_HINT_QDEL @@ -250,7 +250,7 @@ var/list/tape_roll_applications = list() if(!proximity) return - if (istype(A, /obj/machinery/door/airlock)) + if (istype(A, /obj/machinery/door)) var/turf/T = get_turf(A) if(locate(/obj/item/tape, A.loc)) user << "There's already tape over that door!" diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 8b31517fd0..c390cb0abd 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -253,6 +253,17 @@ reagents.trans_to_obj(C, (reagents.total_volume/contents.len)) ..() +/obj/item/weapon/storage/rollingpapers + name = "rolling paper pack" + desc = "A small cardboard pack containing several folded rolling papers." + icon_state = "paperbox" + icon = 'icons/obj/cigarettes.dmi' + w_class = ITEMSIZE_TINY + throwforce = 1 + storage_slots = 14 + can_hold = list(/obj/item/weapon/rollingpaper) + starts_with = list(/obj/item/weapon/rollingpaper = 14) + /* * Vial Box */ diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 86923e21e6..c83e96ad04 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -9,9 +9,13 @@ // creates a new object and deletes itself /obj/random/New() ..() - if (!prob(spawn_nothing_percentage)) - spawn_item() - qdel(src) + spawn() + if(istype(src.loc, /obj/structure/loot_pile)) //Spawning from a lootpile is weird, need to wait until we're out of it to do our work. + while(istype(src.loc, /obj/structure/loot_pile)) + sleep(1) + if (!prob(spawn_nothing_percentage)) + spawn_item() + qdel(src) // this function should return a specific item to spawn @@ -42,7 +46,7 @@ /obj/random/tool name = "random tool" desc = "This is a random tool" - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "welder" /obj/random/tool/item_to_spawn() @@ -55,6 +59,32 @@ /obj/item/device/flashlight, /obj/item/device/multitool) +/obj/random/tool/power + name = "random powertool" + desc = "This is a random powertool" + icon_state = "jaws_pry" + +/obj/random/tool/power/item_to_spawn() + return pick(/obj/item/weapon/screwdriver/power, + /obj/item/weapon/wirecutters/power, + /obj/item/weapon/weldingtool/electric, + /obj/item/weapon/weldingtool/experimental) + +/obj/random/tool/alien + name = "random alien tool" + desc = "This is a random tool" + icon = 'icons/obj/abductor.dmi' + icon_state = "welder" + +/obj/random/tool/alien/item_to_spawn() + return pick(/obj/item/weapon/screwdriver/alien, + /obj/item/weapon/wirecutters/alien, + /obj/item/weapon/weldingtool/alien, + /obj/item/weapon/crowbar/alien, + /obj/item/weapon/wrench/alien, + /obj/item/stack/cable_coil/alien, + /obj/item/device/multitool/alien) + /obj/random/technology_scanner name = "random scanner" desc = "This is a random technology scanner." @@ -131,6 +161,29 @@ prob(1);/obj/item/taperoll/atmos, prob(1);/obj/item/device/flashlight/maglight) +/obj/random/tech_supply/component + name = "random tech component" + desc = "This is a random machine component." + icon = 'icons/obj/items.dmi' + icon_state = "portable_analyzer" + +/obj/random/tech_supply/component/item_to_spawn() + return pick(prob(3);/obj/item/weapon/stock_parts/gear, + prob(2);/obj/item/weapon/stock_parts/console_screen, + prob(1);/obj/item/weapon/stock_parts/spring, + prob(3);/obj/item/weapon/stock_parts/capacitor, + prob(2);/obj/item/weapon/stock_parts/capacitor/adv, + prob(1);/obj/item/weapon/stock_parts/capacitor/super, + prob(3);/obj/item/weapon/stock_parts/manipulator, + prob(2);/obj/item/weapon/stock_parts/manipulator/nano, + prob(1);/obj/item/weapon/stock_parts/manipulator/pico, + prob(3);/obj/item/weapon/stock_parts/matter_bin, + prob(2);/obj/item/weapon/stock_parts/matter_bin/adv, + prob(1);/obj/item/weapon/stock_parts/matter_bin/super, + prob(3);/obj/item/weapon/stock_parts/scanning_module, + prob(2);/obj/item/weapon/stock_parts/scanning_module/adv, + prob(1);/obj/item/weapon/stock_parts/scanning_module/phasic) + /obj/random/medical name = "Random Medicine" desc = "This is a random medical item." @@ -1538,8 +1591,7 @@ var/list/multi_point_spawns icon_state = "phoron" /obj/random/mob/spider/mutant/item_to_spawn() - return pick(prob(1);/obj/random/mob/spider, - prob(5);/mob/living/simple_animal/hostile/giant_spider/nurse/medical, + return pick(prob(5);/obj/random/mob/spider, prob(10);/mob/living/simple_animal/hostile/giant_spider/webslinger, prob(10);/mob/living/simple_animal/hostile/giant_spider/carrier, prob(33);/mob/living/simple_animal/hostile/giant_spider/lurker, diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 43369fb2fa..353dbe31a7 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -22,6 +22,8 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh density = FALSE anchored = TRUE + var/list/icon_states_to_use = list() // List of icon states the pile can choose from on initialization. If empty or null, it will stay the initial icon_state. + var/list/searched_by = list() // Keys that have searched this loot pile, with values of searched time. var/allow_multiple_looting = FALSE // If true, the same person can loot multiple times. Mostly for debugging. var/busy = FALSE // Used so you can't spamclick to loot. @@ -113,12 +115,9 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh var/path = pick(rare_loot) return new path(src) - -/obj/structure/loot_pile/maint - var/list/icon_states_to_use = list() - -/obj/structure/loot_pile/maint/initialize() - icon_state = pick(icon_states_to_use) +/obj/structure/loot_pile/initialize() + if(icon_states_to_use && icon_states_to_use.len) + icon_state = pick(icon_states_to_use) . = ..() // Has large amounts of possible items, most of which may or may not be useful. @@ -438,7 +437,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh // Base type for alien piles. /obj/structure/loot_pile/surface/alien name = "alien pod" - desc = "A pod which looks bigger on the inside. Something quiet shiny might be inside?" + desc = "A pod which looks bigger on the inside. Something quite shiny might be inside?" icon_state = "alien_pile1" /obj/structure/loot_pile/surface/alien @@ -568,3 +567,266 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/weapon/gun/launcher/crossbow ) +// Subtype for mecha and mecha accessories. These might not always be on the surface. +/obj/structure/loot_pile/mecha + name = "pod wreckage" + desc = "The ruins of some unfortunate pod. Perhaps something is salvageable." + icon = 'icons/mecha/mecha.dmi' + icon_state = "engineering_pod-broken" + density = TRUE + + chance_uncommon = 20 + chance_rare = 10 + + loot_depletion = TRUE + loot_left = 9 + + common_loot = list( + /obj/random/tool, + /obj/random/tool, + /obj/random/tool, + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/random/tech_supply/component, + /obj/random/tech_supply/component, + /obj/effect/decal/remains/lizard, + /obj/effect/decal/remains/mouse, + /obj/effect/decal/remains/robot, + /obj/item/stack/material/steel{amount = 40} + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser, + /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, + /obj/item/mecha_parts/mecha_equipment/tool/drill, + /obj/item/mecha_parts/mecha_equipment/generator + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser, + /obj/item/mecha_parts/mecha_equipment/generator/nuclear, + /obj/item/mecha_parts/mecha_equipment/tool/jetpack + ) + +//Stuff you may find attached to a ripley. +/obj/structure/loot_pile/mecha/ripley + name = "ripley wreckage" + desc = "The ruins of some unfortunate ripley. Perhaps something is salvageable." + icon_states_to_use = list("ripley-broken", "firefighter-broken", "ripley-broken-old") + + common_loot = list( + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/item/stack/material/steel{amount = 25}, + /obj/item/stack/material/glass{amount = 10}, + /obj/item/stack/material/plasteel{amount = 5}, + /obj/item/mecha_parts/chassis/ripley, + /obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg, + /obj/item/device/kit/paint/ripley, + /obj/item/device/kit/paint/ripley/flames_red, + /obj/item/device/kit/paint/ripley/flames_blue + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, + /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill, + /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster, + /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/gravcatapult, + /obj/item/mecha_parts/mecha_equipment/tool/rcd, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged + ) + +//Death-Ripley, same common, but more combat-exosuit-based +/obj/structure/loot_pile/mecha/deathripley + name = "strange ripley wreckage" + icon_state = "deathripley-broken" + + common_loot = list( + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/item/stack/material/steel{amount = 40}, + /obj/item/stack/material/glass{amount = 20}, + /obj/item/stack/material/plasteel{amount = 10}, + /obj/item/mecha_parts/chassis/ripley, + /obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg, + /obj/item/device/kit/paint/ripley/death + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser, + /obj/item/mecha_parts/mecha_equipment/repair_droid, + /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/tool/rcd, + /obj/item/mecha_parts/mecha_equipment/wormhole_generator, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged + ) + +/obj/structure/loot_pile/mecha/odysseus + name = "odysseus wreckage" + desc = "The ruins of some unfortunate odysseus. Perhaps something is salvageable." + icon_state = "odysseus-broken" + + common_loot = list( + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/item/stack/material/steel{amount = 25}, + /obj/item/stack/material/glass{amount = 10}, + /obj/item/stack/material/plasteel{amount = 5}, + /obj/item/mecha_parts/chassis/odysseus, + /obj/item/mecha_parts/part/odysseus_head, + /obj/item/mecha_parts/part/odysseus_torso, + /obj/item/mecha_parts/part/odysseus_left_arm, + /obj/item/mecha_parts/part/odysseus_right_arm, + /obj/item/mecha_parts/part/odysseus_left_leg, + /obj/item/mecha_parts/part/odysseus_right_leg + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/tool/sleeper, + /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flare, + /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/gravcatapult, + /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster, + /obj/item/mecha_parts/mecha_equipment/shocker + ) + +/obj/structure/loot_pile/mecha/gygax + name = "gygax wreckage" + desc = "The ruins of some unfortunate gygax. Perhaps something is salvageable." + icon_state = "gygax-broken" + + common_loot = list( + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/item/stack/material/steel{amount = 25}, + /obj/item/stack/material/glass{amount = 10}, + /obj/item/stack/material/plasteel{amount = 5}, + /obj/item/mecha_parts/chassis/gygax, + /obj/item/mecha_parts/part/gygax_head, + /obj/item/mecha_parts/part/gygax_torso, + /obj/item/mecha_parts/part/gygax_left_arm, + /obj/item/mecha_parts/part/gygax_right_arm, + /obj/item/mecha_parts/part/gygax_left_leg, + /obj/item/mecha_parts/part/gygax_right_leg, + /obj/item/mecha_parts/part/gygax_armour + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/shocker, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, + /obj/item/device/kit/paint/gygax, + /obj/item/device/kit/paint/gygax/darkgygax, + /obj/item/device/kit/paint/gygax/recitence + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, + /obj/item/mecha_parts/mecha_equipment/repair_droid, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy + ) + +/obj/structure/loot_pile/mecha/durand + name = "durand wreckage" + desc = "The ruins of some unfortunate durand. Perhaps something is salvageable." + icon_state = "durand-broken" + + common_loot = list( + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/item/stack/material/steel{amount = 25}, + /obj/item/stack/material/glass{amount = 10}, + /obj/item/stack/material/plasteel{amount = 5}, + /obj/item/mecha_parts/chassis/durand, + /obj/item/mecha_parts/part/durand_head, + /obj/item/mecha_parts/part/durand_torso, + /obj/item/mecha_parts/part/durand_left_arm, + /obj/item/mecha_parts/part/durand_right_arm, + /obj/item/mecha_parts/part/durand_left_leg, + /obj/item/mecha_parts/part/durand_right_leg, + /obj/item/mecha_parts/part/durand_armour + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/shocker, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser, + /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster, + /obj/item/device/kit/paint/durand, + /obj/item/device/kit/paint/durand/seraph, + /obj/item/device/kit/paint/durand/phazon + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot, + /obj/item/mecha_parts/mecha_equipment/repair_droid, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy + ) + +/obj/structure/loot_pile/mecha/phazon + name = "phazon wreckage" + desc = "The ruins of some unfortunate phazon. Perhaps something is salvageable." + icon_state = "phazon-broken" + + common_loot = list( + /obj/item/weapon/storage/toolbox/syndicate/powertools, + /obj/item/stack/material/plasteel{amount = 20}, + /obj/item/stack/material/durasteel{amount = 10}, + /obj/item/mecha_parts/chassis/phazon, + /obj/item/mecha_parts/part/phazon_head, + /obj/item/mecha_parts/part/phazon_torso, + /obj/item/mecha_parts/part/phazon_left_arm, + /obj/item/mecha_parts/part/phazon_right_arm, + /obj/item/mecha_parts/part/phazon_left_leg, + /obj/item/mecha_parts/part/phazon_right_leg + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/shocker, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy, + /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion, + /obj/item/mecha_parts/mecha_equipment/repair_droid, + /obj/item/mecha_parts/mecha_equipment/teleporter + ) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 4765b86ccd..b45eaf69af 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -264,6 +264,8 @@ var/list/mechtoys = list( proc/buy() if(!shoppinglist.len) return + var/orderedamount = shoppinglist.len + var/area/area_shuttle = shuttle.get_location_area() if(!area_shuttle) return @@ -302,7 +304,7 @@ var/list/mechtoys = list( slip.info = "

[command_name()] Shipping Manifest



" slip.info +="Order #[SO.ordernum]
" slip.info +="Destination: [station_name()]
" - slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
" + slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
" slip.info +="CONTENTS: