From 5cf3f258922a2739f0b4ac8e829cc8bbf591caf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mieszko=20J=C4=99drzejczak?= Date: Fri, 22 Apr 2016 17:51:24 +0200 Subject: [PATCH] Ports /tg/ Foam Force guns --- _maps/map_files/RandomZLevels/academy.dmm | 5 +- _maps/map_files/RandomZLevels/spacehotel.dmm | 3 +- .../RandomZLevels/stationCollision.dmm | 7 +- code/datums/supplypacks.dm | 39 ++++- code/datums/uplink_item.dm | 34 ++++- code/game/objects/items/random_items.dm | 4 +- code/game/objects/items/toys.dm | 140 +----------------- .../objects/items/weapons/gift_wrappaper.dm | 4 +- .../objects/items/weapons/storage/boxes.dm | 11 -- code/modules/arcade/prize_datums.dm | 10 +- code/modules/computer3/computers/arcade.dm | 6 +- .../projectiles/ammunition/ammo_casings.dm | 41 ++++- code/modules/projectiles/ammunition/boxes.dm | 14 +- .../projectiles/ammunition/magazines.dm | 60 +++++++- code/modules/projectiles/gun.dm | 14 +- code/modules/projectiles/guns/projectile.dm | 9 +- .../projectiles/guns/projectile/toy.dm | 102 +++++++++++++ .../projectiles/projectile/reusable.dm | 43 ++++++ icons/obj/toyguns.dmi | Bin 0 -> 2562 bytes paradise.dme | 2 + 20 files changed, 361 insertions(+), 187 deletions(-) create mode 100644 code/modules/projectiles/guns/projectile/toy.dm create mode 100644 code/modules/projectiles/projectile/reusable.dm create mode 100644 icons/obj/toyguns.dmi diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 9258caf0cfb..f5ecc09bfe4 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -160,7 +160,7 @@ "dd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) "de" = (/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "df" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) -"dg" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: A+ Educator's Notes: Excellent form."; name = "Summoning Midterm Exam"},/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) +"dg" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: A+ Educator's Notes: Excellent form."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "dh" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/awaymission/academy/classrooms) "di" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/academy/classrooms) "dj" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/academy/classrooms) @@ -340,7 +340,7 @@ "gB" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) "gD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) -"gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/toy/crossbow,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) +"gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "gG" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "gH" = (/obj/structure/window/reinforced,/obj/item/ammo_casing,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms) "gI" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) @@ -672,4 +672,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 62503cc3dd1..ce1e5a290e9 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -189,7 +189,7 @@ "dJ" = (/obj/item/target/syndicate,/turf/simulated/floor/carpet,/area/awaymission) "dK" = (/obj/item/trash/candy,/turf/simulated/floor/carpet,/area/awaymission) "dL" = (/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission) -"dM" = (/obj/item/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission) +"dM" = (/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission) "dN" = (/obj/structure/barricade/wooden,/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission) "dO" = (/obj/machinery/door/airlock,/turf/simulated/floor/carpet,/area/awaymission) "dP" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/wall,/area/awaymission) @@ -322,4 +322,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabReWeXbDbDbDbDbDeSeSeSbDbDbDbDeYeUeVaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZbRfabDeSeWeSbDbDeRbDbDfbfceSeTeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZeNeMeHeIeNeLeLeLeNeMeHeIeNfdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm index d91ef330c60..0f6741251de 100644 --- a/_maps/map_files/RandomZLevels/stationCollision.dmm +++ b/_maps/map_files/RandomZLevels/stationCollision.dmm @@ -286,8 +286,8 @@ "fz" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/mass_spectrometer{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/research) "fA" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/weapon/paper/sc_safehint_paper_caf,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel,/area/awaymission/midblock) "fB" = (/obj/structure/target_stake,/obj/item/weapon/grown/sunflower,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/research) -"fC" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock) -"fD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock) +"fC" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel,/area/awaymission/midblock) +"fD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel,/area/awaymission/midblock) "fE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/airless,/area/awaymission/midblock) "fF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"},/area/awaymission/midblock) "fG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/awaymission/midblock) @@ -315,7 +315,7 @@ "gc" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock) "gd" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/northblock) "ge" = (/obj/item/weapon/storage/secure/safe/sc_ssafe{pixel_x = 4; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/northblock) -"gf" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock) +"gf" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel,/area/awaymission/midblock) "gg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"},/area/awaymission/midblock) "gh" = (/obj/structure/closet/wardrobe/generic,/turf/simulated/floor/plasteel,/area/awaymission/midblock) "gi" = (/turf/simulated/floor/plasteel,/area/awaymission/midblock) @@ -689,4 +689,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzltlFlGlHhuhuhuiYlIkfkfkpkRjKlJjKlKiYlLlMlNlOlOlP aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzgzgzgzgzgzgzgziYlVlWlXiYkfkdlYlZmaiYjKjKjKmbmbmbmbmcjulCmdmejuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYjujujujujuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index f3117a67215..0db941e3ca5 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1348,9 +1348,19 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/mafia name = "Mafia Supply Crate" - contains = list(/obj/item/clothing/suit/browntrenchcoat =1,/obj/item/clothing/suit/blacktrenchcoat =1,/obj/item/clothing/head/fedora/whitefedora =1, - /obj/item/clothing/head/fedora/brownfedora =1,/obj/item/clothing/head/fedora =1,/obj/item/clothing/under/flappers =1,/obj/item/clothing/under/mafia =1,/obj/item/clothing/under/mafia/vest =1,/obj/item/clothing/under/mafia/white =1, - /obj/item/clothing/under/mafia/sue =1,/obj/item/clothing/under/mafia/tan =1, /obj/item/toy/crossbow/tommygun =2) + contains = list(/obj/item/clothing/suit/browntrenchcoat, + /obj/item/clothing/suit/blacktrenchcoat, + /obj/item/clothing/head/fedora/whitefedora, + /obj/item/clothing/head/fedora/brownfedora, + /obj/item/clothing/head/fedora, + /obj/item/clothing/under/flappers, + /obj/item/clothing/under/mafia, + /obj/item/clothing/under/mafia/vest, + /obj/item/clothing/under/mafia/white, + /obj/item/clothing/under/mafia/sue, + /obj/item/clothing/under/mafia/tan, + /obj/item/weapon/gun/projectile/automatic/tommygun/toy, + /obj/item/weapon/gun/projectile/automatic/tommygun/toy) cost = 15 containername = "mafia supply crate" @@ -1385,6 +1395,29 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine ..() +/datum/supply_packs/misc/foamforce + name = "Foam Force Crate" + contains = list(/obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy) + cost = 25 + containername = "foam force crate" + +/datum/supply_packs/misc/foamforce/bonus + name = "Foam Force Pistols Crate" + contains = list(/obj/item/weapon/gun/projectile/automatic/toy/pistol, + /obj/item/weapon/gun/projectile/automatic/toy/pistol, + /obj/item/ammo_box/magazine/toy/pistol, + /obj/item/ammo_box/magazine/toy/pistol) + cost = 40 + containername = "foam force pistols crate" + contraband = 1 + /datum/supply_packs/misc/randomised/contraband num_contained = 5 contains = list(/obj/item/weapon/storage/pill_bottle/random_drug_bottle, diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index cf997f6f28d..cc10ee566af 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -407,6 +407,31 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 0 +/datum/uplink_item/dangerous/foamsmg + name = "Toy Submachine Gun" + desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine." + item = /obj/item/weapon/gun/projectile/automatic/c20r/toy + cost = 12 + gamemodes = list(/datum/game_mode/nuclear) + surplus = 0 + +/datum/uplink_item/dangerous/foammachinegun + name = "Toy Machine Gun" + desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating riot grade darts, that can briefly incapacitate someone in just one volley." + item = /obj/item/weapon/gun/projectile/automatic/l6_saw/toy + cost = 30 + gamemodes = list(/datum/game_mode/nuclear) + surplus = 0 + +/datum/uplink_item/ammo/toydarts + name = "Box of Riot Darts" + desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!" + item = /obj/item/ammo_box/foambox/riot + cost = 10 + gamemodes = list(/datum/game_mode/nuclear) + surplus = 0 + + //for refunding the syndieborg teleporter /datum/uplink_item/dangerous/syndieborg/spawn_item() var/obj/item/weapon/antag_spawner/borg_tele/T = ..() @@ -550,6 +575,13 @@ var/list/uplink_items = list() cost = 8 excludefrom = list(/datum/game_mode/nuclear) +/datum/uplink_item/stealthy_weapons/foampistol + name = "Toy Gun (with Stun Darts)" + desc = "An innocent looking toy pistol designed to fire foam darts. Comes loaded with riot grade darts, to incapacitate a target." + item = /obj/item/weapon/gun/projectile/automatic/toy/pistol/riot + cost = 10 + surplus = 10 + /datum/uplink_item/stealthy_weapons/soap name = "Syndicate Soap" desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people." @@ -1105,4 +1137,4 @@ var/list/uplink_items = list() U.purchase_log += "\icon[C]" for(var/item in bought_items) new item(C) - U.purchase_log += "\icon[item]" \ No newline at end of file + U.purchase_log += "\icon[item]" diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm index f46e2361192..7e15df8676c 100644 --- a/code/game/objects/items/random_items.dm +++ b/code/game/objects/items/random_items.dm @@ -5,7 +5,7 @@ name = "Random Toy" New() ..() - var/list/types = list(/obj/item/toy/crossbow,/obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize) + var/list/types = list(/obj/item/weapon/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize) var/T = pick(types) new T(loc) spawn(1) @@ -332,4 +332,4 @@ new nade3(src) new nade4(src) new nade5(src) - new nade6(src) \ No newline at end of file + new nade6(src) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 8911a3e60f6..6a863bcc60f 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -3,8 +3,6 @@ * Balloons * Fake telebeacon * Fake singularity - * Toy crossbow - * Toy Tommy Gun * Toy swords * Toy mechs * Snap pops @@ -132,142 +130,6 @@ icon = 'icons/obj/singularity.dmi' icon_state = "singularity_s1" - -/* - * Toy crossbow - */ - -/obj/item/toy/crossbow - name = "foam dart crossbow" - desc = "A weapon favored by many overactive children. Ages 8 and up." - icon = 'icons/obj/gun.dmi' - icon_state = "crossbow" - item_state = "crossbow" - lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/guns_righthand.dmi' - w_class = 2.0 - attack_verb = list("attacked", "struck", "hit") - var/bullets = 5 - -/obj/item/toy/crossbow/examine(mob/user) - ..(user) - if (bullets) - to_chat(user, "It is loaded with [bullets] foam darts!") - -/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I, /obj/item/toy/ammo/crossbow)) - if(bullets <= 4) - user.drop_item() - qdel(I) - bullets++ - to_chat(user, "You load the foam dart into the crossbow.") - else - to_chat(usr, "It's already fully loaded.") - - -/obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) - if(!isturf(target.loc) || target == user) return - if(flag) return - - if (locate (/obj/structure/table, src.loc)) - return - else if (bullets) - var/turf/trg = get_turf(target) - var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src)) - bullets-- - D.icon_state = "foamdart" - D.name = "foam dart" - playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) - - for(var/i=0, i<6, i++) - if (D) - if(D.loc == trg) break - step_towards(D,trg) - - for(var/mob/living/M in D.loc) - if(!istype(M,/mob/living)) continue - if(M == user) continue - D.visible_message("[M] was hit by the foam dart!") - new /obj/item/toy/ammo/crossbow(M.loc) - qdel(D) - return - - for(var/atom/A in D.loc) - if(A == user) continue - if(A.density) - new /obj/item/toy/ammo/crossbow(A.loc) - qdel(D) - - sleep(1) - - spawn(10) - if(D) - new /obj/item/toy/ammo/crossbow(D.loc) - qdel(D) - - return - else if (bullets == 0) - user.Weaken(5) - user.visible_message("[user] realized they were out of ammo and starting scrounging for some!") - - - -/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob) - add_fingerprint(user) - -// ******* Check - - if (bullets > 0 && M.lying) - visible_message("[user] casually lines up a shot with [M]'s head and pulls the trigger!", "You hear the sound of foam against skull.") - M.visible_message("[M] was hit in the head by the foam dart!") - playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) - new /obj/item/toy/ammo/crossbow(M.loc) - bullets-- - else if (M.lying && bullets == 0) - visible_message("[user] casually lines up a shot with [M]'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", "You hear someone fall.") - user.Weaken(5) - return - -/obj/item/toy/ammo/crossbow - name = "foam dart" - desc = "Its nerf or nothing! Ages 8 and up." - icon = 'icons/obj/toy.dmi' - icon_state = "foamdart" - w_class = 1.0 - -/obj/effect/foam_dart_dummy - name = "" - desc = "" - icon = 'icons/obj/toy.dmi' - icon_state = "null" - anchored = 1 - density = 0 - - -/* - * Tommy gun - */ - -/obj/item/toy/crossbow/tommygun - name = "tommy gun" - desc = "Looks almost like the real thing! Great for practicing Drive-bys" - icon_state = "tommy" - item_state = "tommy" - flags = CONDUCT - w_class = 1.0 - attack_verb = list("struck", "hammered", "hit", "bashed") - bullets = 20.0 - -/obj/item/toy/crossbow/tommygun/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I, /obj/item/toy/ammo/crossbow)) - if(bullets <= 19) - user.drop_item() - qdel(I) - bullets++ - to_chat(user, "You load the foam dart into the tommy gun.") - else - to_chat(user, "It's already fully loaded.") - /* * Toy swords */ @@ -1777,4 +1639,4 @@ obj/item/toy/cards/deck/syndicate/black 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.") \ No newline at end of file + possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.") diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 00433885ad5..c4c1fd38604 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -80,7 +80,7 @@ /obj/item/weapon/banhammer, /obj/item/toy/balloon, /obj/item/toy/blink, - /obj/item/toy/crossbow, + /obj/item/weapon/gun/projectile/shotgun/toy/crossbow, /obj/item/weapon/gun/projectile/revolver/capgun, /obj/item/toy/katana, /obj/random/mech, @@ -115,7 +115,7 @@ /obj/item/toy/AI, /obj/item/clothing/under/syndicate/tacticool, /obj/item/weapon/storage/box/fakesyndiesuit, - /obj/item/toy/crossbow/tommygun, + /obj/item/weapon/gun/projectile/automatic/tommygun/toy, /obj/item/stack/tile/fakespace/loaded, ) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index b93fc3b06b1..ce1e6aad9bb 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -685,14 +685,3 @@ new /obj/item/weapon/lipstick/green(src) new /obj/item/weapon/lipstick/blue(src) new /obj/item/weapon/lipstick/white(src) - -/obj/item/weapon/storage/box/foam_darts - name = "Foam Dart Pack" - desc = "Extra ammo for foam dart launchers. Contains 10 darts." - storage_slots = 10 - max_combined_w_class = 10 - -/obj/item/weapon/storage/box/foam_darts/New() - ..() - for(var/i=1; i <= storage_slots; i++) - new /obj/item/toy/ammo/crossbow(src) diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index d67adf97bcb..d404fbaf855 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -93,8 +93,8 @@ var/global/datum/prizes/global_prizes = new /datum/prize_item/foam_darts name = "Pack of Foam Darts" - desc = "A refill pack of 10 foam darts." - typepath = /obj/item/weapon/storage/box/foam_darts + desc = "A refill pack with foam darts." + typepath = /obj/item/ammo_box/foambox cost = 20 /datum/prize_item/minigibber @@ -174,9 +174,10 @@ var/global/datum/prizes/global_prizes = new /datum/prize_item/crossbow name = "Foam Dart Crossbow" desc = "A toy crossbow that fires foam darts." - typepath = /obj/item/toy/crossbow + typepath = /obj/item/weapon/gun/projectile/shotgun/toy/crossbow cost = 100 + /datum/prize_item/toy_xeno name = "Xeno Action Figure" desc = "A lifelike replica of the horrific xeno scourge." @@ -252,9 +253,10 @@ var/global/datum/prizes/global_prizes = new /datum/prize_item/tommygun name = "Tommygun" desc = "A replica tommygun that fires foam darts." - typepath = /obj/item/toy/crossbow/tommygun + typepath = /obj/item/weapon/gun/projectile/automatic/tommygun/toy cost = 175 + /datum/prize_item/esword name = "Toy Energy Sword" desc = "A plastic replica of an energy blade." diff --git a/code/modules/computer3/computers/arcade.dm b/code/modules/computer3/computers/arcade.dm index a99c05410ae..6949bfff107 100644 --- a/code/modules/computer3/computers/arcade.dm +++ b/code/modules/computer3/computers/arcade.dm @@ -7,8 +7,8 @@ /obj/item/toy/blink = 2, /obj/item/clothing/under/syndicate/tacticool = 2, /obj/item/toy/sword = 2, - /obj/item/weapon/gun/projectile/revolver/capgun = 2, - /obj/item/toy/crossbow = 2, + /obj/item/weapon/gun/projectile/revolver/capgun = 2, + /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2, /obj/item/clothing/suit/syndicatefake = 2, /obj/item/weapon/storage/fancy/crayons = 2, /obj/item/toy/spinningtoy = 2, @@ -177,4 +177,4 @@ if(interactable()) computer.updateUsrDialog() blocked = 0 - return \ No newline at end of file + return diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 8fc29a6ce7b..1527dfc2b64 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -255,4 +255,43 @@ desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher." caliber = "40mm" icon_state = "40mmHE" - projectile_type = "/obj/item/projectile/bullet/a40mm" \ No newline at end of file + projectile_type = "/obj/item/projectile/bullet/a40mm" + +//FOAM DARTS +/obj/item/ammo_casing/caseless/foam_dart + name = "foam dart" + desc = "Its nerf or nothing! Ages 8 and up." + projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart" + caliber = "foam_force" + icon = 'icons/obj/toyguns.dmi' + icon_state = "foamdart" + var/modified = 0 + +/obj/item/ammo_casing/caseless/foam_dart/update_icon() + ..() + if (modified) + icon_state = "foamdart_empty" + desc = "Its nerf or nothing! ...Although, this one doesn't look too safe." + +/obj/item/ammo_casing/caseless/foam_dart/attackby(var/obj/item/A as obj, mob/user as mob, params) + ..() + if (istype(A, /obj/item/weapon/screwdriver) && !modified) + modified = 1 + BB.damage_type = BRUTE + icon_state = "foamdart_empty" + desc = "Its nerf or nothing! ...Although, this one doesn't look too safe." + user << "You pop the safety cap off of [src]." + else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len) + if (!user.unEquip(A)) + return + A.loc = BB + BB.damage = 5 + BB.nodamage = 0 + user << "You insert [A] into [src]." + return + +/obj/item/ammo_casing/caseless/foam_dart/riot + name = "riot foam dart" + desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." + projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart/riot" + icon_state = "foamdart_riot" diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 96f8cca31c0..eb998823b6a 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -86,4 +86,16 @@ name = "Ammunition Box (tranquilizer darts)" icon_state = "45box" ammo_type = /obj/item/ammo_casing/shotgun/tranquilizer - materials = list(MAT_METAL=1750) \ No newline at end of file + materials = list(MAT_METAL=1750) + +//FOAM DARTS +/obj/item/ammo_box/foambox + name = "ammo box (Foam Darts)" + icon = 'icons/obj/toyguns.dmi' + icon_state = "foambox" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 40 + +/obj/item/ammo_box/foambox/riot + icon_state = "foambox_riot" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 7cf8e9fcdb0..13757e8de0d 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -101,6 +101,14 @@ max_ammo = 5 multiload = 1 +/obj/item/ammo_box/magazine/internal/shot/toy + ammo_type = "/obj/item/ammo_casing/caseless/foam_dart" + caliber = "foam_force" + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/toy/crossbow + max_ammo = 5 + ///////////EXTERNAL MAGAZINES//////////////// /obj/item/ammo_box/magazine/m10mm @@ -290,4 +298,54 @@ /obj/item/ammo_box/magazine/m12g/dragon name = "shotgun magazine (12g dragon's breath)" icon_state = "m12gf" - ammo_type = "/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath" \ No newline at end of file + ammo_type = "/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath" + +//FOAM DARTS +/obj/item/ammo_box/magazine/toy + name = "foam force META magazine" + ammo_type = "/obj/item/ammo_casing/caseless/foam_dart" + caliber = "foam_force" + +/obj/item/ammo_box/magazine/toy/smg + name = "foam force SMG magazine" + icon_state = "smg9mm-30" + max_ammo = 30 + +/obj/item/ammo_box/magazine/toy/smg/update_icon() + ..() + icon_state = "smg9mm-[round(ammo_count(),6)]" + +/obj/item/ammo_box/magazine/toy/smg/riot + ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot" + +/obj/item/ammo_box/magazine/toy/pistol + name = "foam force pistol magazine" + icon_state = "9x19p" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/toy/pistol/riot + ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot" + +/obj/item/ammo_box/magazine/toy/smgm45 + name = "donksoft SMG magazine" + ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot" + max_ammo = 20 + +/obj/item/ammo_box/magazine/toy/smgm45/update_icon() + ..() + icon_state = "c20r45-[round(ammo_count(),2)]" + +/obj/item/ammo_box/magazine/toy/m762 + name = "donksoft box magazine" + ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot" + max_ammo = 50 + +/obj/item/ammo_box/magazine/toy/m762/update_icon() + ..() + icon_state = "a762-[round(ammo_count(),10)]" + +/obj/item/ammo_box/magazine/toy/tommygunm45 + name = "little tommy's mag" + icon_state = "drum45" + max_ammo = 50 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 2aea246d314..e68e384e940 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -279,19 +279,19 @@ //Suicide handling. if (M == user && user.zone_sel.selecting == "mouth" && !mouthshoot) mouthshoot = 1 - M.visible_message("\red [user] sticks their gun in their mouth, ready to pull the trigger...") + M.visible_message(" [user] sticks their gun in their mouth, ready to pull the trigger...") if(!do_after(user, 40, target = M)) - M.visible_message("\blue [user] decided life was worth living") + M.visible_message(" [user] decided life was worth living") mouthshoot = 0 return if (process_chambered()) - user.visible_message("[user] pulls the trigger.") + user.visible_message("[user] pulls the trigger.") if(silenced) playsound(user, fire_sound, 10, 1) else playsound(user, fire_sound, 50, 1) - if(istype(in_chamber, /obj/item/projectile/lasertag)) - user.show_message("You feel rather silly, trying to commit suicide with a toy.") + if(istype(in_chamber, /obj/item/projectile/lasertag) || istype(in_chamber, /obj/item/projectile/bullet/reusable/foam_dart)) + user.show_message("You feel rather silly, trying to commit suicide with a toy.") mouthshoot = 0 return in_chamber.on_hit(M) @@ -299,7 +299,7 @@ user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() else - to_chat(user, "Ow...") + to_chat(user, "Ow...") user.apply_effect(110,STAMINA,0) del(in_chamber) mouthshoot = 0 @@ -383,4 +383,4 @@ update_icon() else set_light(0) - return \ No newline at end of file + return diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index d6fb9d9aff0..8844f5cd7ab 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -16,15 +16,18 @@ + + /obj/item/weapon/gun/projectile/New() ..() - magazine = new mag_type(src) + if (!magazine) + magazine = new mag_type(src) chamber_round() update_icon() return -/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1) +/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1 ) // if(in_chamber) // return 1 @@ -146,4 +149,4 @@ item_state = "suppressor" w_class = 2 var/oldsound = null - var/initial_w_class = null \ No newline at end of file + var/initial_w_class = null diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm new file mode 100644 index 00000000000..350b53f9aa1 --- /dev/null +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -0,0 +1,102 @@ +/obj/item/weapon/gun/projectile/automatic/toy + name = "foam force SMG" + desc = "A prototype three-round burst toy submachine gun. Ages 8 and up." + icon = 'icons/obj/toyguns.dmi' + icon_state = "saber" + item_state = "gun" + mag_type = "/obj/item/ammo_box/magazine/toy/smg" + fire_sound = 'sound/items/syringeproj.ogg' + force = 0 + throwforce = 0 + burst_size = 3 + can_suppress = 0 + clumsy_check = 0 + needs_permit = 0 + +/obj/item/weapon/gun/projectile/automatic/toy/process_chambered() + return ..(0, 1) + +/obj/item/weapon/gun/projectile/automatic/toy/pistol + name = "foam force pistol" + desc = "A small, easily concealable toy handgun. Ages 8 and up." + icon_state = "pistol" + w_class = 2 + mag_type = "/obj/item/ammo_box/magazine/toy/pistol" + can_suppress = 0 + burst_size = 1 + fire_delay = 0 + action_button_name = null + +/obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon() + ..() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot + name = "foam force riot pistol" + desc = "RIOT! Ages 8 and up." + +/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot/New() + magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src) + ..() + +/obj/item/weapon/gun/projectile/automatic/c20r/toy + name = "donksoft SMG" + desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up." + icon = 'icons/obj/toyguns.dmi' + can_suppress = 0 + needs_permit = 0 + mag_type = "/obj/item/ammo_box/magazine/toy/smgm45" + +/obj/item/weapon/gun/projectile/automatic/c20r/toy/process_chambered() + return ..(0, 1) + +/obj/item/weapon/gun/projectile/automatic/l6_saw/toy + name = "donksoft LMG" + desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up." + icon = 'icons/obj/toyguns.dmi' + can_suppress = 0 + needs_permit = 0 + mag_type = "/obj/item/ammo_box/magazine/toy/m762" + +/obj/item/weapon/gun/projectile/automatic/l6_saw/toy/process_chambered() + return ..(0, 1) + +/obj/item/weapon/gun/projectile/automatic/tommygun/toy + name = "tommy gun" + desc = "Looks almost like the real thing! Great for practicing Drive-bys. Ages 8 and up." + icon_state = "tommygun" + item_state = "shotgun" + w_class = 2 + mag_type = "/obj/item/ammo_box/magazine/toy/tommygunm45" + fire_sound = 'sound/items/syringeproj.ogg' + +/obj/item/weapon/gun/projectile/automatic/tommygun/toy/process_chambered() + return ..(0, 1) + +/obj/item/weapon/gun/projectile/shotgun/toy + name = "foam force shotgun" + desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up." + icon = 'icons/obj/toyguns.dmi' + force = 0 + throwforce = 0 + origin_tech = null + mag_type = "/obj/item/ammo_box/magazine/internal/shot/toy" + fire_sound = 'sound/items/syringeproj.ogg' + clumsy_check = 0 + needs_permit = 0 + +/obj/item/weapon/gun/projectile/shotgun/toy/pump_unload() + if(chambered)//We have a shell in the chamber + chambered = null + if(in_chamber) + in_chamber = null + +/obj/item/weapon/gun/projectile/shotgun/toy/crossbow + name = "foam force crossbow" + desc = "A weapon favored by many overactive children. Ages 8 and up." + icon = 'icons/obj/gun.dmi' + icon_state = "crossbow" + item_state = "crossbow" + mag_type = "/obj/item/ammo_box/magazine/internal/shot/toy/crossbow" + slot_flags = SLOT_BELT + w_class = 2 diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm new file mode 100644 index 00000000000..367d20b6992 --- /dev/null +++ b/code/modules/projectiles/projectile/reusable.dm @@ -0,0 +1,43 @@ +/obj/item/projectile/bullet/reusable + name = "reusable bullet" + desc = "How do you even reuse a bullet?" + var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/ + var/hit = 0 + +/obj/item/projectile/bullet/reusable/on_hit(var/atom/target, var/blocked = 0) + if(!proj_hit) + proj_hit = 1 + if (src.contents.len) + var/obj/content + for(content in src.contents) + content.loc = src.loc + else + new ammo_type(src.loc) + ..() + +/obj/item/projectile/bullet/reusable/on_range() + if(!proj_hit) + if (src.contents.len) + var/obj/content + for(content in src.contents) + content.loc = src.loc + else + new ammo_type(src.loc) + ..() + +/obj/item/projectile/bullet/reusable/foam_dart + name = "foam dart" + desc = "I hope you're wearing eye protection." + damage = 0 // It's a damn toy. + damage_type = OXY + nodamage = 1 + icon = 'icons/obj/toyguns.dmi' + icon_state = "foamdart" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + range = 10 + +/obj/item/projectile/bullet/reusable/foam_dart/riot + name = "riot foam dart" + icon_state = "foamdart_riot" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + stamina = 25 diff --git a/icons/obj/toyguns.dmi b/icons/obj/toyguns.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fee7774cae553b6e63d8c85d5ab699fe8740ad67 GIT binary patch literal 2562 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