From 41f110380cded2ab3cf0831eabd77adff3a9ff5a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 14 May 2017 22:18:02 -0500 Subject: [PATCH] [MIRROR] [READY]Gives the clown a pie cannon, also improves pneumatic cannons (#935) * [READY]Gives the clown a pie cannon, also improves pneumatic cannons * Delete gang.dm.rej --- code/game/objects/items/weapons/clown.dm | 46 +++++++ .../objects/items/weapons/pneumaticCannon.dm | 126 +++++++++++++++--- code/modules/jobs/job_types/civilian.dm | 3 +- icons/obj/pneumaticCannon.dmi | Bin 3389 -> 4063 bytes 4 files changed, 154 insertions(+), 21 deletions(-) create mode 100644 code/game/objects/items/weapons/clown.dm diff --git a/code/game/objects/items/weapons/clown.dm b/code/game/objects/items/weapons/clown.dm new file mode 100644 index 0000000000..a01a0f18b6 --- /dev/null +++ b/code/game/objects/items/weapons/clown.dm @@ -0,0 +1,46 @@ + +/obj/item/weapon/pie_cannon + name = "pie cannon" + desc = "Load cream pie for optimal results" + force = 10 + icon_state = "piecannon" + item_state = "powerfist" + var/obj/item/weapon/reagent_containers/food/snacks/pie/loaded = null + +/obj/item/weapon/pie_cannon/attackby(obj/item/I, mob/living/L) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/pie)) + if(!loaded) + L.transferItemToLoc(I, src) + loaded = I + to_chat(L, "You load the [I] into the [src]!") + return + return ..() + +/obj/item/weapon/pie_cannon/afterattack(atom/target, mob/living/user, flag, params) + if(!loaded) + return ..() + var/obj/item/projectile/pie/launched = new /obj/item/projectile/pie(src) + launched.P = loaded + loaded.forceMove(launched) + launched.appearance = loaded.appearance + loaded = null + launched.preparePixelProjectile(target, get_turf(target), user, params, 0) + launched.forceMove(get_turf(src)) + launched.fire() + user.visible_message("[user] fires the [src] at [target]!") + +/obj/item/projectile/pie + name = "pie" + desc = "Think fast!" + var/obj/item/weapon/reagent_containers/food/snacks/pie/P = null + +/obj/item/projectile/pie/on_hit(atom/A) + . = ..() + if(P) + A.visible_message("[P] smashes into [A] at high velocity!") + P.forceMove(get_turf(A)) + P.throw_impact(A) + if(ismovableatom(A)) + var/atom/movable/AM = A + if(!AM.anchored) + AM.throw_at(get_edge_target_turf(get_dir(src, AM), 3, 2)) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 61e68934b9..d1370c9d7c 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -1,3 +1,7 @@ + +#define PCANNON_FIREALL 1 +#define PCANNON_FILO 2 +#define PCANNON_FIFO 3 /obj/item/weapon/pneumatic_cannon name = "pneumatic cannon" desc = "A gas-powered cannon that can fire any object loaded into it." @@ -16,7 +20,15 @@ var/gasPerThrow = 3 //How much gas is drawn from a tank's pressure to fire var/list/loadedItems = list() //The items loaded into the cannon that will be fired out var/pressureSetting = 1 //How powerful the cannon is - higher pressure = more gas but more powerful throws + var/checktank = TRUE + var/range_multiplier = 1 + var/throw_amount = 20 //How many items to throw per fire + var/fire_mode = PCANNON_FIREALL + var/automatic = FALSE + var/clumsyCheck = TRUE +/obj/item/weapon/pneumatic_cannon/CanItemAutoclick() + return automatic /obj/item/weapon/pneumatic_cannon/examine(mob/user) ..() @@ -30,6 +42,8 @@ /obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params) + if(user.a_intent == INTENT_HARM) + return ..() if(istype(W, /obj/item/weapon/tank/internals)) if(!tank) var/obj/item/weapon/tank/internals/IT = W @@ -55,19 +69,31 @@ to_chat(user, "\The [src] can't hold any more items!") else if(istype(W, /obj/item)) var/obj/item/IW = W - if((loadedWeightClass + IW.w_class) > maxWeightClass) - to_chat(user, "\The [IW] won't fit into \the [src]!") - return - if(IW.w_class > src.w_class) - to_chat(user, "\The [IW] is too large to fit into \the [src]!") - return - if(!user.transferItemToLoc(W, src)) - return - to_chat(user, "You load \the [IW] into \the [src].") - loadedItems.Add(IW) - loadedWeightClass += IW.w_class + load_item(IW, user) +/obj/item/weapon/pneumatic_cannon/proc/can_load_item(obj/item/I, mob/user) + if((loadedWeightClass + I.w_class) > maxWeightClass) //Only make messages if there's a user + if(user) + to_chat(user, "\The [I] won't fit into \the [src]!") + return FALSE + if(I.w_class > w_class) + if(user) + to_chat(user, "\The [I] is too large to fit into \the [src]!") + return FALSE + return TRUE +/obj/item/weapon/pneumatic_cannon/proc/load_item(obj/item/I, mob/user) + if(!can_load_item(I, user)) + return FALSE + if(user) //Only use transfer proc if there's a user, otherwise just set loc. + if(!user.transferItemToLoc(I, src)) + return FALSE + to_chat(user, "You load \the [I] into \the [src].") + else + I.forceMove(src) + loadedItems += I + loadedWeightClass += I.w_class + return TRUE /obj/item/weapon/pneumatic_cannon/afterattack(atom/target, mob/living/carbon/human/user, flag, params) if(flag && user.a_intent == INTENT_HARM) //melee attack @@ -76,7 +102,6 @@ return Fire(user, target) - /obj/item/weapon/pneumatic_cannon/proc/Fire(mob/living/carbon/human/user, var/atom/target) if(!istype(user) && !target) return @@ -90,13 +115,13 @@ if(!loadedItems || !loadedWeightClass) to_chat(user, "\The [src] has nothing loaded.") return - if(!tank) + if(!tank && checktank) to_chat(user, "\The [src] can't fire without a source of gas.") return if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting)) to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") return - if(user.disabilities & CLUMSY && prob(75)) + if(user.disabilities & CLUMSY && prob(75) && clumsyCheck) user.visible_message("[user] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") user.drop_item() if(prob(10)) @@ -109,17 +134,48 @@ user.visible_message("[user] fires \the [src]!", \ "You fire \the [src]!") add_logs(user, target, "fired at", src) + var/turf/T = get_target(target, get_turf(src)) playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) - for(var/obj/item/ITD in loadedItems) //Item To Discharge - loadedItems.Remove(ITD) - loadedWeightClass -= ITD.w_class - ITD.throw_speed = pressureSetting * 2 - ITD.loc = get_turf(src) - ITD.throw_at(target, pressureSetting * 5, pressureSetting * 2,user) + fire_items(T, user) if(pressureSetting >= 3 && user) user.visible_message("[user] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") user.Weaken(3) +/obj/item/weapon/pneumatic_cannon/proc/fire_items(turf/target, mob/user) + if(fire_mode == PCANNON_FIREALL) + for(var/obj/item/ITD in loadedItems) //Item To Discharge + if(!throw_item(target, ITD, user)) + break + else + for(var/i in 1 to throw_amount) + if(!loadedItems.len) + break + var/obj/item/I + if(fire_mode == PCANNON_FILO) + I = loadedItems[loadedItems.len] + else + I = loadedItems[1] + if(!throw_item(target, I, user)) + break + +/obj/item/weapon/pneumatic_cannon/proc/throw_item(turf/target, obj/item/I, mob/user) + if(!istype(I)) + return FALSE + loadedItems -= I + loadedWeightClass -= I.w_class + I.forceMove(get_turf(src)) + I.throw_at(target, pressureSetting * 10 * range_multiplier, pressureSetting * 2, user) + return TRUE + +/obj/item/weapon/pneumatic_cannon/proc/get_target(turf/target, turf/starting) + if(range_multiplier == 1) + return target + var/x_o = (target.x - starting.x) + var/y_o = (target.y - starting.y) + var/new_x = Clamp((starting.x + (x_o * range_multiplier)), 0, world.maxx) + var/new_y = Clamp((starting.y + (y_o * range_multiplier)), 0, world.maxy) + var/turf/newtarget = locate(new_x, new_y, starting.z) + return newtarget /obj/item/weapon/pneumatic_cannon/ghetto //Obtainable by improvised methods; more gas per use, less capacity, but smaller name = "improvised pneumatic cannon" @@ -164,3 +220,33 @@ return add_overlay(tank.icon_state) src.update_icon() + +/obj/item/weapon/pneumatic_cannon/proc/fill_with_type(type, amount) + if(!ispath(type, /obj/item)) + return FALSE + var/loaded = 0 + for(var/i in 1 to amount) + var/obj/item/I = new type + if(!load_item(I, null)) + qdel(I) + return loaded + loaded++ + +/obj/item/weapon/pneumatic_cannon/pie + name = "pie cannon" + desc = "Load cream pie for optimal results" + force = 10 + icon_state = "piecannon" + gasPerThrow = 0 + checktank = FALSE + range_multiplier = 3 + fire_mode = PCANNON_FIFO + throw_amount = 1 + maxWeightClass = 100 //50 pies. :^) + clumsyCheck = FALSE + +/obj/item/weapon/pneumatic_cannon/pie/can_load_item(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/pie)) + return ..() + to_chat(user, "[src] only accepts pies!") + return FALSE diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 57883966b0..7d983e5519 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -35,7 +35,8 @@ Clown /obj/item/weapon/reagent_containers/spray/waterflower = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, /obj/item/device/megaphone/clown = 1, - /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1 + /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1, + /obj/item/weapon/pneumatic_cannon/pie = 1 ) implants = list(/obj/item/weapon/implant/sad_trombone) diff --git a/icons/obj/pneumaticCannon.dmi b/icons/obj/pneumaticCannon.dmi index 41de7677b561009674fb2c085171701adacaa96d..86e14e19d6b94b2a9ae0391cbf69254be9f3e186 100644 GIT binary patch literal 4063 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 TWvnrW00000NkvXXu0mjfUOJGU