From f45aff1bae5f63ab7ba686681481f4453219996b Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sat, 24 Mar 2012 16:42:44 -0700 Subject: [PATCH] Chameleon Jumpsuit now has armor, space tiles now get generated faster, fixed fingerprint runtime, optimized autosay, fixed crates + package wrappers, retired admins are no longer spammed, can now click through blindness, packages and evidence bag contents now count toward traitor objectives, stunning and such stops you instantly, guncode improvements. --- code/defines/obj/clothing/jumpsuit.dm | 1 + code/defines/turf.dm | 2 +- code/game/atom_procs.dm | 2 +- .../game/gamemodes/autotraitor/autotraitor.dm | 11 - code/game/gamemodes/game_mode.dm | 2 +- code/game/objects/items/clothing.dm | 10 +- code/game/objects/radio/radio.dm | 101 +------ code/game/objects/storage/crates.dm | 2 + code/modules/admin/admin.dm | 2 +- .../mob/living/carbon/alien/humanoid/hud.dm | 1 + .../mob/living/carbon/alien/larva/hud.dm | 1 + code/modules/mob/living/carbon/brain/hud.dm | 3 +- code/modules/mob/living/carbon/human/hud.dm | 1 + code/modules/mob/living/carbon/monkey/hud.dm | 1 + code/modules/mob/living/living.dm | 28 +- code/modules/mob/living/silicon/robot/hud.dm | 1 + code/modules/mob/mob_movement.dm | 7 +- code/modules/mob/new_player/preferences.dm | 5 +- code/modules/projectiles/gun.dm | 253 ++++++++++++------ code/modules/projectiles/guns/energy.dm | 6 +- code/modules/projectiles/guns/energy/laser.dm | 6 +- code/modules/projectiles/guns/energy/pulse.dm | 1 + code/modules/projectiles/guns/energy/stun.dm | 3 + code/modules/projectiles/guns/projectile.dm | 3 +- .../projectiles/guns/projectile/automatic.dm | 1 + code/modules/projectiles/projectile.dm | 43 ++- code/modules/projectiles/projectile/beams.dm | 3 +- code/modules/projectiles/projectile/energy.dm | 6 + code/modules/recycling/sortingmachinery.dm | 2 + code/unused/hivebot/hud.dm | 1 + 30 files changed, 285 insertions(+), 224 deletions(-) diff --git a/code/defines/obj/clothing/jumpsuit.dm b/code/defines/obj/clothing/jumpsuit.dm index e94c4482e7a..a6b2d3c1f49 100644 --- a/code/defines/obj/clothing/jumpsuit.dm +++ b/code/defines/obj/clothing/jumpsuit.dm @@ -29,6 +29,7 @@ desc = "A plain jumpsuit. It seems to have a small dial on the wrist." origin_tech = "syndicate=3" var/list/clothing_choices = list() + armor = list(melee = 10, bullet = 0, laser = 50,energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/chameleon/psyche item_state = "bl_suit" diff --git a/code/defines/turf.dm b/code/defines/turf.dm index a91921f9567..bf567accc7d 100644 --- a/code/defines/turf.dm +++ b/code/defines/turf.dm @@ -47,7 +47,7 @@ /turf/space/New() // icon = 'space.dmi' ..() - icon_state = "[pick(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)]" + icon_state = "[rand(1,25)]" /turf/simulated name = "station" diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm index 90045f9845f..771d8a1dd80 100644 --- a/code/game/atom_procs.dm +++ b/code/game/atom_procs.dm @@ -126,7 +126,7 @@ if(src.fingerprints.len == 1) src.fingerprints = list() else - for(var/j = i, j <= (src.fingerprints.len), j++) + for(var/j = i, j < (src.fingerprints.len), j++) src.fingerprints[j] = src.fingerprints[j+1] src.fingerprints.len-- else diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 2459e87bc70..f0ecb88ddca 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -15,12 +15,6 @@ /datum/game_mode/traitor/autotraitor/pre_setup() possible_traitors = get_players_for_role(BE_TRAITOR) - for(var/datum/mind/player in possible_traitors) - for(var/job in restricted_jobs) - if(player.assigned_role == job) - possible_traitors -= player - - for(var/mob/new_player/P in world) if(P.client && P.ready) num_players++ @@ -84,11 +78,6 @@ traitorcount += 1 if (player.client && player.mind && !player.mind.special_role && player.stat != 2 && (player.be_syndicate & BE_TRAITOR) && !jobban_isbanned(player, "Syndicate")) possible_traitors += player - for(var/datum/mind/player in possible_traitors) - for(var/job in restricted_jobs) - if(player.assigned_role == job) - possible_traitors -= player - //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") // message_admins("Potential Traitors:") diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2bd03a3bd13..86246238a58 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -39,7 +39,7 @@ Stealthy and Inconspicuous Weapons; /obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; Whitespace:Seperator; Stealth and Camouflage Items; -/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/under/chameleon:4:Chameleon Jumpsuit, with armor.; /obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; /obj/item/weapon/card/id/syndicate:3:Agent ID card; /obj/item/clothing/mask/gas/voice:4:Voice Changer; diff --git a/code/game/objects/items/clothing.dm b/code/game/objects/items/clothing.dm index 602a0288154..606c69229da 100644 --- a/code/game/objects/items/clothing.dm +++ b/code/game/objects/items/clothing.dm @@ -114,10 +114,10 @@ THERMAL GLASSES var/obj/item/clothing/under/V = new U src.clothing_choices += V - for(var/U in typesof(/obj/item/clothing/under/rank)-(/obj/item/clothing/under/rank)) +// for(var/U in typesof(/obj/item/clothing/under/rank)-(/obj/item/clothing/under/rank)) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V +// var/obj/item/clothing/under/V = new U +// src.clothing_choices += V return @@ -163,7 +163,7 @@ THERMAL GLASSES var/obj/item/clothing/under/A - A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices + A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices|null if(!A) return @@ -410,4 +410,4 @@ THERMAL GLASSES src.flags &= ~HEADCOVERSEYES icon_state = "engspace_helmet_clear" usr << "You toggle the reflective tint off." - usr.update_clothing() \ No newline at end of file + usr.update_clothing() diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm index 4a9d0da87fd..9b9e1fb1710 100644 --- a/code/game/objects/radio/radio.dm +++ b/code/game/objects/radio/radio.dm @@ -243,107 +243,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use if (!connection) return - if(subspace_transmission) - // First, we want to generate a new radio signal - var/datum/signal/signal = new - signal.transmission_method = 2 // 2 would be a subspace transmission. - // transmission_method could probably be enumerated through #define. Would be neater. - - // --- Finally, tag the actual signal with the appropriate values --- - signal.data = list( - // Identity-associated tags: - "mob" = new /mob/living/silicon/ai(src), // store a reference to the mob - "mobtype" = /mob/living/silicon/ai, // the mob's type - "realname" = from, // the mob's real name - "name" = from, // the mob's display name - "job" = "Automated Announcement", // the mob's job - "key" = "none", // the mob's key - "vmessage" = "*garbled automated announcement*", // the message to display if the voice wasn't understood - "vname" = "synthesized voice", // the name to display if the voice wasn't understood - "vmask" = 0, // 1 if the mob is using a voice gas mask - - // We store things that would otherwise be kept in the actual mob - // so that they can be logged even AFTER the mob is deleted or something - - // Other tags: - "compression" = rand(45,50), // compressed radio signal - "message" = message, // the actual sent message - "connection" = connection, // the radio connection to use - "radio" = src, // stores the radio used for transmission - "slow" = 0, // how much to sleep() before broadcasting - simulates net lag - "traffic" = 0, // dictates the total traffic sum that the signal went through - "type" = 0, // determines what type of radio input it is: normal broadcast - "server" = null, // the last server to log this signal - "reject" = 0 // if nonzero, the signal will not be accepted by any broadcasting machinery - ) - signal.frequency = connection.frequency // Quick frequency set - - //#### Sending the signal to all subspace receivers ####// - for(var/obj/machinery/telecomms/receiver/R in world) - R.receive_signal(signal) - - // Allinone can act as receivers. - for(var/obj/machinery/telecomms/allinone/R in world) - R.receive_signal(signal) - - // Receiving code can be located in Telecommunications.dm - return - - - /* ###### Intercoms and station-bounced radios ###### */ - - var/filter_type = 2 - - var/datum/signal/signal = new - signal.transmission_method = 2 - - - /* --- Try to send a normal subspace broadcast first */ - - signal.data = list( - - "mob" = new /mob/living/silicon/ai(src), // store a reference to the mob - "mobtype" = /mob/living/silicon/ai, // the mob's type - "realname" = from, // the mob's real name - "name" = from, // the mob's display name - "job" = "Automated Announcement", // the mob's job - "key" = "none", // the mob's key - "vmessage" = "*garbled automated announcement*", // the message to display if the voice wasn't understood - "vname" = "synthesized voice", // the name to display if the voice wasn't understood - "vmask" = 0, // 1 if the mob is using a voice gas mask - - // We store things that would otherwise be kept in the actual mob - // so that they can be logged even AFTER the mob is deleted or something - - // Other tags: - "compression" = 0, // compressed radio signal - "message" = message, // the actual sent message - "connection" = connection, // the radio connection to use - "radio" = src, // stores the radio used for transmission - "slow" = 0, // how much to sleep() before broadcasting - simulates net lag - "traffic" = 0, // dictates the total traffic sum that the signal went through - "type" = 0, // determines what type of radio input it is: normal broadcast - "server" = null, // the last server to log this signal - "reject" = 0 // if nonzero, the signal will not be accepted by any broadcasting machinery - ) - signal.frequency = connection.frequency // Quick frequency set - - for(var/obj/machinery/telecomms/receiver/R in world) - R.receive_signal(signal) - - - sleep(rand(10,25)) // wait a little... - - if(signal.data["done"]) - del(signal) // delete the signal - we're done here. - return - - // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet. - // Send a mundane broadcast with limited targets: - Broadcast_Message(connection, new /mob/living/silicon/ai(src), 0, "*garbled automated announcement*", - src, message, from, "Automated Announcement", from, "synthesized voice", - filter_type, signal.data["compression"]) + src, message, from, "Automated Announcement", from, "synthesized voice", 4, 0) return /obj/item/device/radio/talk_into(mob/M as mob, message, channel) diff --git a/code/game/objects/storage/crates.dm b/code/game/objects/storage/crates.dm index edb8ccc4c4f..0ad00b3a4c7 100644 --- a/code/game/objects/storage/crates.dm +++ b/code/game/objects/storage/crates.dm @@ -286,6 +286,8 @@ user.drop_item() if(W) W.loc = src.loc + else if(istype(W,/obj/item/weapon/packageWrap)) + return else return attack_hand(user) /obj/structure/closet/crate/secure/emp_act(severity) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c7a2f07f27c..d61a98881a8 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -3,7 +3,7 @@ /proc/message_admins(var/text, var/admin_ref = 0) var/rendered = "ADMIN LOG: [text]" for (var/mob/M in world) - if (M && M.client && M.client.holder) + if (M && M.client && M.client.holder && M.client.holder.level > -3) //Lets not spam our retirees. if (admin_ref) M << dd_replaceText(rendered, "%admin_ref%", "\ref[M]") else diff --git a/code/modules/mob/living/carbon/alien/humanoid/hud.dm b/code/modules/mob/living/carbon/alien/humanoid/hud.dm index ec2a726538d..cbcb149464e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/hud.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/hud.dm @@ -264,6 +264,7 @@ mymob.blind.screen_loc = "1,1 to 15,15" mymob.blind.layer = 0 mymob.blind.mouse_opacity = 0 + mymob.blind.mouse_opacity = 0 mymob.flash = new /obj/screen( null ) mymob.flash.icon = 'screen1_alien.dmi' diff --git a/code/modules/mob/living/carbon/alien/larva/hud.dm b/code/modules/mob/living/carbon/alien/larva/hud.dm index d8e976a8e8f..cfe29e2b5e7 100644 --- a/code/modules/mob/living/carbon/alien/larva/hud.dm +++ b/code/modules/mob/living/carbon/alien/larva/hud.dm @@ -193,6 +193,7 @@ mymob.blind.name = " " mymob.blind.screen_loc = "1,1 to 15,15" mymob.blind.layer = 0 + mymob.blind.mouse_opacity = 0 mymob.flash = new /obj/screen( null ) mymob.flash.icon = 'screen1_alien.dmi' diff --git a/code/modules/mob/living/carbon/brain/hud.dm b/code/modules/mob/living/carbon/brain/hud.dm index a15ff458e87..0a2a2f226fb 100644 --- a/code/modules/mob/living/carbon/brain/hud.dm +++ b/code/modules/mob/living/carbon/brain/hud.dm @@ -27,4 +27,5 @@ mymob.blind.icon_state = "blackanimate" mymob.blind.name = " " mymob.blind.screen_loc = "1,1 to 15,15" - mymob.blind.layer = 0 \ No newline at end of file + mymob.blind.layer = 0 + mymob.blind.mouse_opacity = 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm index 0748588199a..02f6974676f 100644 --- a/code/modules/mob/living/carbon/human/hud.dm +++ b/code/modules/mob/living/carbon/human/hud.dm @@ -538,6 +538,7 @@ mymob.blind.name = " " mymob.blind.screen_loc = "1,1 to 15,15" mymob.blind.layer = 0 + mymob.blind.mouse_opacity = 0 mymob.flash = new /obj/screen( null ) mymob.flash.icon = ui_style diff --git a/code/modules/mob/living/carbon/monkey/hud.dm b/code/modules/mob/living/carbon/monkey/hud.dm index f41726cf1dc..579edf18e6a 100644 --- a/code/modules/mob/living/carbon/monkey/hud.dm +++ b/code/modules/mob/living/carbon/monkey/hud.dm @@ -444,6 +444,7 @@ mymob.blind.name = " " mymob.blind.screen_loc = "1,1 to 15,15" mymob.blind.layer = 0 + mymob.blind.mouse_opacity = 0 mymob.flash = new /obj/screen( null ) mymob.flash.icon = ui_style diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 865c29e217c..f95bf469a4d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -70,23 +70,31 @@ /mob/living/get_contents() var/list/L = list() L += src.contents - for(var/obj/item/weapon/storage/S in src.contents) - L += S.return_inv() - for(var/obj/item/weapon/gift/G in src.contents) - L += G.gift + for(var/obj/item/weapon/storage/S in L) + L |= S.return_inv() + for(var/obj/item/weapon/gift/G in L) + L |= G.gift if (istype(G.gift, /obj/item/weapon/storage)) - L += G.gift:return_inv() + L |= G.gift:return_inv() + for(var/obj/item/weapon/evidencebag/E in L) + L |= E:contents + for(var/obj/item/smallDelivery/S in L) + L |= S.wrapped return L /mob/living/proc/check_contents_for(A) var/list/L = list() L += src.contents - for(var/obj/item/weapon/storage/S in src.contents) - L += S.return_inv() - for(var/obj/item/weapon/gift/G in src.contents) - L += G.gift + for(var/obj/item/weapon/storage/S in L) + L |= S.return_inv() + for(var/obj/item/weapon/gift/G in L) + L |= G.gift if (istype(G.gift, /obj/item/weapon/storage)) - L += G.gift:return_inv() + L |= G.gift:return_inv() + for(var/obj/item/weapon/evidencebag/E in L) + L |= E:contents + for(var/obj/item/smallDelivery/S in L) + L |= S.wrapped for(var/obj/B in L) if(B.type == A) diff --git a/code/modules/mob/living/silicon/robot/hud.dm b/code/modules/mob/living/silicon/robot/hud.dm index fb8c6397199..691b0a98065 100644 --- a/code/modules/mob/living/silicon/robot/hud.dm +++ b/code/modules/mob/living/silicon/robot/hud.dm @@ -217,6 +217,7 @@ mymob.blind.name = " " mymob.blind.screen_loc = "1,1 to 15,15" mymob.blind.layer = 0 + mymob.blind.mouse_opacity = 0 mymob.flash = new /obj/screen( null ) mymob.flash.icon = 'screen1_robot.dmi' diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 0b6f753d3d1..d30fc1ab884 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -154,8 +154,13 @@ return if(Process_Grab()) return - if(!mob.canmove) return +//Making mob movememnt changes instant. + if(mob.paralysis || mob.stunned || mob.weakened || mob.buckled || (mob.changeling && mob.changeling.changeling_fakedeath)) + mob.canmove = 0 + return + else + mob.canmove = 1 if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV)) if(!mob.Process_Spacemove(0)) return 0 diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm index f3c1755db16..577c29d74e6 100644 --- a/code/modules/mob/new_player/preferences.dm +++ b/code/modules/mob/new_player/preferences.dm @@ -730,7 +730,7 @@ datum/preferences if(link_tags["underwear"]) if(!IsGuestKey(user.key)) - switch(link_tags["underwear"]) + /*switch(link_tags["underwear"]) if("random") if(prob (75)) underwear = 1 @@ -740,7 +740,8 @@ datum/preferences if(underwear == 1) underwear = 0 else - underwear = 1 + underwear = 1*/ + underwear = !underwear if(link_tags["be_special"]) src.be_special^=(1<.> + automatic = 0 //Used to determine if you can target multiple people. + mob/living/last_moved_mob //Used to fire faster at more than one person. + told_cant_shoot = 0 //So that it doesn't spam them with the fact they cannot hit them. - proc - load_into_chamber() - special_check(var/mob/M) - - - load_into_chamber() + proc/load_into_chamber() return 0 //Removing the lock and the buttons. dropped(mob/user as mob) if(target) - target.NotTargeted(src) - del(user.item_use_icon) + for(var/mob/living/M in target) + if(M) + M.NotTargeted(src) //Untargeting people. + del(target) + del(user.item_use_icon) //Removing the control icons. del(user.gun_move_icon) del(user.gun_run_icon) return ..() - special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. + proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. return 1 @@ -51,26 +52,33 @@ //Handling lowering yer gun. attack_self() if(target) - target.NotTargeted(src) + for(var/mob/living/M in target) + if(M) + M.NotTargeted(src) + del(target) usr.visible_message("\blue [usr] lowers \the [src]...") return 0 return 1 //Suiciding. attack(mob/living/M as mob, mob/living/user as mob, def_zone) - if (M == user && user.zone_sel.selecting == "mouth" && load_into_chamber() && !mouthshoot) + if (M == user && user.zone_sel.selecting == "mouth" && load_into_chamber() && !mouthshoot) //Suicide handling. mouthshoot = 1 M.visible_message("\red [user] sticks their gun in their mouth, ready to pull the trigger...") if(!do_after(user, 40)) M.visible_message("\blue [user] decided life was worth living") + mouthshoot = 0 return - if(istype(src.in_chamber, /obj/item/projectile/bullet) && !istype(src.in_chamber, /obj/item/projectile/bullet/stunshot)) + if(istype(src.in_chamber, /obj/item/projectile/bullet) && !istype(src.in_chamber, /obj/item/projectile/bullet/stunshot) && !istype(src.in_chamber, /obj/item/ammo_casing/shotgun/beanbag)) M.apply_damage(75, BRUTE, "head", used_weapon = "Suicide attempt with a projectile weapon.") M.apply_damage(85, BRUTE, "chest") M.visible_message("\red [user] pulls the trigger.") else if(istype(src.in_chamber, /obj/item/projectile/bullet/stunshot) || istype(src.in_chamber, /obj/item/projectile/energy/electrode)) M.apply_damage(10, BURN, "head", used_weapon = "Suicide attempt with a stun round.") M.visible_message("\red [user] pulls the trigger, but luckily it was a stun round.") + else if(istype(src.in_chamber, /obj/item/ammo_casing/shotgun/beanbag)) + M.apply_damage(20, BRUTE, "head", used_weapon = "Suicide attempt with a beanbag.") + M.visible_message("\red [user] pulls the trigger, but luckily it was a stun round.") else if(istype(src.in_chamber, /obj/item/projectile/beam) || istype(src.in_chamber, /obj/item/projectile/energy)) M.apply_damage(75, BURN, "head", used_weapon = "Suicide attempt with an energy weapon") M.apply_damage(85, BURN, "chest") @@ -82,17 +90,23 @@ del(in_chamber) mouthshoot = 0 return - else if(target && M == target) - PreFire(M,user) - return else if(user.a_intent == "hurt" && load_into_chamber() && (istype(src.in_chamber, /obj/item/projectile/beam) || istype(src.in_chamber, /obj/item/projectile/energy)\ - || istype(src.in_chamber, /obj/item/projectile/bullet))) + || istype(src.in_chamber, /obj/item/projectile/bullet)) && !istype(in_chamber,/obj/item/projectile/energy/electrode)) //Point blank shooting. //Lets shoot them, then. user.visible_message("\red [user] fires \the [src] point blank at [M]!") - M.apply_damage(30+in_chamber.damage,BRUTE,"Point Blank Shot") //So we'll put him an inch from death. + if(silenced) + playsound(user, fire_sound, 10, 1) + else + playsound(user, fire_sound, 50, 1) + M.apply_damage(30+in_chamber.damage, BRUTE, used_weapon = "Point Blank Shot") //So we'll put him an inch from death. + M.attack_log += text("\[[]\] []/[] shot []/[] point blank with a []", time_stamp(), user, user.ckey, M, M.ckey, src) + user.attack_log += text("\[[]\] []/[] shot []/[] point blank with a []", time_stamp(), user, user.ckey, M, M.ckey, src) + log_admin("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) point blank with [src].") + message_admins("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) point blank with [src].") del(in_chamber) + update_icon() return - else if(user.a_intent != "hurt" && load_into_chamber() && istype(src,/obj/item/weapon/gun/energy/taser)) + else if(user.a_intent != "hurt" && load_into_chamber() && istype(in_chamber,/obj/item/projectile/energy/electrode)) //Point blank tasering. if (prob(50)) if (M.paralysis < 60 && (!(M.mutations & 8)) ) M.paralysis = 60 @@ -101,18 +115,33 @@ M.weakened = 60 if (M.stuttering < 60 && (!(M.mutations & 8)) ) M.stuttering = 60 + if(silenced) + playsound(user, fire_sound, 10, 1) + else + playsound(user, fire_sound, 50, 1) user.visible_message("\red [M] has been stunned with the taser gun by [user]!") + M.attack_log += text("\[[]\] []/[] stunned []/[] with a []", time_stamp(), user, user.ckey, M, M.ckey, src) + user.attack_log += text("\[[]\] []/[] stunned []/[] with a []", time_stamp(), user, user.ckey, M, M.ckey, src) + log_admin("ATTACK: [user] ([user.ckey]) stunned [M] ([M.ckey]) with [src].") + message_admins("ATTACK: [user] ([user.ckey]) stunned [M] ([M.ckey]) with [src].") del(in_chamber) + update_icon() + return + else if(target && M in target) //Yer targeting them, and 1 tile away. FIRE! + if(!load_into_chamber()) //No ammo, hit them! + return ..() + else + PreFire(M,user) ///Otherwise, shoot! return else - return ..() + return ..() //Pistolwhippin' //POWPOW!... Used to be afterattack. proc/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params)//TODO: go over this if(istype(user, /mob/living)) var/mob/living/M = user - if ((M.mutations & CLUMSY) && prob(50)) + if ((M.mutations & CLUMSY) && prob(50)) ///Who ever came up with this... M << "\red \the [src] blows up in your face." M.take_organ_damage(0,20) M.drop_item() @@ -132,9 +161,7 @@ if(!special_check(user)) return if(!load_into_chamber()) - user << "\red *click*"; - for(var/mob/M in orange(4,src.loc)) - M.show_message("*click, click*") + user.visible_message("*click click*", "\red *click*") return if(!in_chamber) return @@ -174,7 +201,7 @@ in_chamber.p_y = text2num(mouse_control["icon-y"]) spawn() - if(in_chamber) in_chamber.process() + if(in_chamber) in_chamber.fired() sleep(1) in_chamber = null @@ -184,11 +211,14 @@ //Aiming at the target mob. proc/Aim(var/mob/M) - if(target != M) + if(!target || !(M in target)) lock_time = world.time - if(target) + if(target && !automatic) //If they're targeting someone and they have a non automatic weapon. //usr.ClearRequest("Aim") - target.NotTargeted(src) + for(var/mob/living/L in target) + if(L) + L.NotTargeted(src) + del(target) usr.visible_message("\red [usr] turns \the [src] on [M]!") else usr.visible_message("\red [usr] aims \a [src] at [M]!") @@ -198,15 +228,29 @@ //HE MOVED, SHOOT HIM! - proc/TargetActed() - var/mob/M = loc - if(target == M) return - if(src != M.equipped()) - target.NotTargeted(src) + proc/TargetActed(var/mob/living/T) + var/mob/living/M = loc + if(M == T) return + if(!istype(M) || src != M.equipped()) + for(var/mob/living/N in target) + if(N) + N.NotTargeted(src) + del(target) return - usr.last_move_intent = world.time - Fire(target,usr) - var/dir_to_fire = sd_get_approx_dir(M,target) + M.last_move_intent = world.time + if(load_into_chamber()) + var/firing_check = in_chamber.check_fire(T,usr) //0 if it cannot hit them, 1 if it is capable of hitting, and 2 if a special check is preventing it from firing. + if(firing_check > 0) + if(firing_check == 1) + Fire(T,usr) + else if(!told_cant_shoot) + M << "\red They can't be hit from here!" + told_cant_shoot = 1 + spawn(30) + told_cant_shoot = 0 + else + usr.visible_message("*click click*", "\red *click*") + var/dir_to_fire = sd_get_approx_dir(M,T) if(dir_to_fire != M.dir) M.dir = dir_to_fire @@ -214,30 +258,32 @@ if(flag) return //we're placing gun on a table or in backpack if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) return//Shouldnt flag take care of this? if(user && user.client && user.client.gun_mode) - PreFire(A,user,params) + PreFire(A,user,params) //They're using the new gun system, locate what they're aiming at. else - Fire(A,user,params) + Fire(A,user,params) //Otherwise, fire normally. //Compute how to fire..... proc/PreFire(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, params) //GraphicTrace(usr.x,usr.y,A.x,A.y,usr.z) - if(lock_time > world.time - 2) return - if(!ismob(A)) + if(lock_time > world.time - 2) return //Lets not spam it. + if(!ismob(A)) //Didn't click someone, check if there is anyone along that guntrace // var/mob/M = locate() in range(0,A) // if(M && !ismob(A)) // if(M.type == /mob) // return FindTarget(M,user,params) - var/mob/M = GunTrace(usr.x,usr.y,A.x,A.y,usr.z,usr) - if(M && ismob(M) && isliving(M) && !target) + var/mob/M = GunTrace(usr.x,usr.y,A.x,A.y,usr.z,usr) //Find dat mob. + if(M && ismob(M) && isliving(M) && M in view(user)) if(!(M.client && M.client.admin_invis)) - Aim(M) + Aim(M) //Aha! Aim at them! return - if(ismob(A) && isliving(A) && target != A) - Aim(A) + else if(!ismob(M) || (ismob(M) && !(M in view(user)))) //Nope! They weren't there! + Fire(A,user,params) //Fire like normal, then. + if(ismob(A) && isliving(A) && !(A in target)) + Aim(A) //Clicked a mob, aim at them. else if(lock_time < world.time + 10) - Fire(A,user,params) + Fire(A,user,params) //Bang! else if(!target) - Fire(A,user,params) + Fire(A,user,params) //Boom! //else //var/item/gun/G = usr.OHand //if(!G) @@ -247,7 +293,7 @@ //Fire(A,2) //else //Fire(A) - var/dir_to_fire = sd_get_approx_dir(usr,A) + var/dir_to_fire = sd_get_approx_dir(usr,A) //Turn them to face their target. if(dir_to_fire != usr.dir) usr.dir = dir_to_fire @@ -303,20 +349,36 @@ mob/var obj/effect/target_locked/target_locked = null mob/proc - Targeted(var/obj/item/weapon/gun/I) + Targeted(var/obj/item/weapon/gun/I) //Self explanitory. + if(!I.target) + I.target = list(src) + else if(I.automatic && I.target.len < 5) //Automatic weapon, they can hold down a room. + I.target += src + else if(I.target.len >= 5) //Otherwise, they can just aim at one person. + if(ismob(I.loc)) + I.loc << "You can only target 5 people at once!" + return + else + return if(!targeted_by) targeted_by = list() targeted_by += I - I.target = src - I.lock_time = world.time + 20 //Target has 1 second to realize they're targeted and stop (or target the opponent). + I.lock_time = world.time + 20 //Target has 2 second to realize they're targeted and stop (or target the opponent). src << "((\red Your character is being targeted. They have 2 seconds to stop any click or move actions. \black While targeted, they may \ drag and drop items in or into the map, speak, and click on interface buttons. Clicking on the map, their items \ (other than a weapon to de-target), or moving will result in being fired upon. \red The aggressor may also fire manually, \ so try not to get on their bad side.\black ))" if(targeted_by.len == 1) spawn(0) - target_locked = new /obj/effect/target_locked(src) + target_locked = new /obj/effect/target_locked(src) //Add the overlay overlays += target_locked - spawn flick("locking",target_locked) + spawn(0) //Make it show the 2 states properly + if(target_locked) + target_locked.icon_state = "locking" + update_clothing() + sleep(20) + if(target_locked) + target_locked.icon_state = "locked" + update_clothing() var/mob/T = I.loc //Adding the buttons to the controler person if(T) @@ -325,32 +387,47 @@ mob/proc if(T.client) T.client.screen += T.item_use_icon T.client.screen += T.gun_move_icon + if(m_intent == "run" && T.client && T.client.target_can_move == 1 && T.client.target_can_run == 0) + src << "\red Your move intent is now set to walk, as your targeter permits it." //Self explanitory. + m_intent = "walk" + hud_used.move_intent.icon_state = "walking" while(targeted_by && T.client) sleep(1) if(last_move_intent > I.lock_time + 10 && !T.client.target_can_move) //If the target moved while targeted - I.TargetActed() - I.lock_time = world.time + 10 + I.TargetActed(src) + if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. + I.lock_time = world.time + 5 + I.lock_time = world.time + 5 + I.last_moved_mob = src else if(last_move_intent > I.lock_time + 10 && !T.client.target_can_run && m_intent == "run") //If the target ran while targeted - I.TargetActed() - I.lock_time = world.time + 10 + I.TargetActed(src) + if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. + I.lock_time = world.time + 5 + I.lock_time = world.time + 5 + I.last_moved_mob = src if(last_target_click > I.lock_time + 10 && !T.client.target_can_click) //If the target clicked the map to pick something up/shoot/etc - I.TargetActed() - I.lock_time = world.time + 10 + I.TargetActed(src) + if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. + I.lock_time = world.time + 5 + I.lock_time = world.time + 5 + I.last_moved_mob = src - NotTargeted(var/obj/item/weapon/gun/I,silent) - if(!silent) + NotTargeted(var/obj/item/weapon/gun/I) + if(!I.silenced) for(var/mob/M in viewers(src)) M << 'TargetOff.ogg' - del(target_locked) + del(target_locked) //Remove the overlay targeted_by -= I - I.target = null - var/mob/T = I.loc - if(T && ismob(T)) + I.target.Remove(src) //De-target them + if(!I.target.len) + del(I.target) + var/mob/T = I.loc //Remove the targeting icons + if(T && ismob(T) && !I.target) del(T.item_use_icon) del(T.gun_move_icon) del(T.gun_run_icon) if(!targeted_by.len) del targeted_by - spawn(1) update_clothing() + spawn(1) update_clothing() //Finally, update the image. /* Captive(var/obj/item/weapon/gun/I) Sound(src,'CounterAttack.ogg') @@ -400,16 +477,17 @@ client/var gun_mode = 0 mob/Move() . = ..() - for(var/obj/item/weapon/gun/G in targeted_by) + for(var/obj/item/weapon/gun/G in targeted_by) //Handle moving out of the gunner's view. var/mob/M = G.loc if(!(M in view(src))) //ClearRequest("Aim") NotTargeted(G) - for(var/obj/item/weapon/gun/G in src) + for(var/obj/item/weapon/gun/G in src) //Handle the gunner loosing sight of their target/s if(G.target) - if(!(G.target in view(src))) - //ClearRequest("Aim") - G.target.NotTargeted(G) + for(var/mob/living/M in G.target) + if(M && !(M in view(src))) + //ClearRequest("Aim") + M.NotTargeted(G) client/verb //These are called by the on-screen buttons, adjusting what the victim can and cannot do. AllowTargetMove() @@ -434,10 +512,15 @@ client/verb for(var/obj/item/weapon/gun/G in usr) G.lock_time = world.time + 5 if(G.target) - if(!target_can_move) - G.target << "Your character may now walk at the discretion of their targeter." - else - G.target << "\red Your character will now be shot if they move." + for(var/mob/living/M in G.target) + if(!target_can_move) + M << "Your character may now walk at the discretion of their targeter." + if(!target_can_run) + M << "\red Your move intent is now set to walk, as your targeter permits it." + M.m_intent = "walk" + M.hud_used.move_intent.icon_state = "walking" + else + M << "\red Your character will now be shot if they move." AllowTargetRun() set hidden=1 spawn(1) target_can_run = !target_can_run @@ -456,10 +539,11 @@ client/verb for(var/obj/item/weapon/gun/G in src) G.lock_time = world.time + 5 if(G.target) - if(!target_can_run) - G.target << "Your character may now run at the discretion of their targeter." - else - G.target << "\red Your character will now be shot if they run." + for(var/mob/living/M in G.target) + if(!target_can_run) + M << "Your character may now run at the discretion of their targeter." + else + M << "\red Your character will now be shot if they run." AllowTargetClick() set hidden=1 spawn(1) target_can_click = !target_can_click @@ -478,10 +562,11 @@ client/verb for(var/obj/item/weapon/gun/G in src) G.lock_time = world.time + 5 if(G.target) - if(!target_can_click) - G.target << "Your character may now use items at the discretion of their targeter." - else - G.target << "\red Your character will now be shot if they use items." + for(var/mob/living/M in G.target) + if(!target_can_click) + M << "Your character may now use items at the discretion of their targeter." + else + M << "\red Your character will now be shot if they use items." ToggleGunMode() set hidden = 1 diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 84d069df95f..9d58d3d39ab 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -27,7 +27,11 @@ load_into_chamber() - if(in_chamber) return 1 + if(in_chamber) + if(!istype(in_chamber, projectile_type)) + del(in_chamber) + in_chamber = new projectile_type(src) + return 1 if(!power_supply) return 0 if(!power_supply.use(charge_cost)) return 0 if(!projectile_type) return 0 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index ebe73507f73..207e60f114c 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -47,7 +47,11 @@ obj/item/weapon/gun/energy/laser/retro /obj/item/weapon/gun/energy/laser/cyborg/load_into_chamber() - if(in_chamber) return 1 + if(in_chamber) + if(!istype(in_chamber, projectile_type)) + del(in_chamber) + in_chamber = new projectile_type(src) + return 1 if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc if(R && R.cell) diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 79814620688..2146d065e42 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -7,6 +7,7 @@ charge_cost = 200 projectile_type = "/obj/item/projectile/beam/pulse" cell_type = "/obj/item/weapon/cell/super" + automatic = 1 var/mode = 2 diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 29c200bb8a0..740ba192209 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -13,6 +13,9 @@ /obj/item/weapon/gun/energy/taser/cyborg/load_into_chamber()//TOOD: change this over to the slowly recharge other cell if(in_chamber) + if(!istype(in_chamber, projectile_type)) + del(in_chamber) + in_chamber = new projectile_type(src) return 1 if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 7d0912806d0..9f09417a9cb 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -6,7 +6,7 @@ origin_tech = "combat=2;materials=2" w_class = 3.0 m_amt = 1000 - force = 30 //Pistol whipp'n good. (It was frigging SIXTY on pre-goon code) + force = 10 //Pistol whipp'n good. (It was frigging SIXTY on pre-goon code) var ammo_type = "/obj/item/ammo_casing/a357" @@ -25,6 +25,7 @@ load_into_chamber() + if(in_chamber) return 1 if(!loaded.len) return 0 var/obj/item/ammo_casing/AC = loaded[1] //load next casing. diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 46086b8e48d..060c17718b4 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -7,6 +7,7 @@ caliber = "9mm" origin_tech = "combat=4;materials=2" ammo_type = "/obj/item/ammo_casing/c9mm" + automatic = 1 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 9248c85e34c..0849d9a63fe 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -55,6 +55,20 @@ return 1 + proc/check_fire(var/mob/living/target as mob, var/mob/living/user as mob) //Checks if you can hit them or not. + if(!istype(target) || !istype(user)) + return 0 + var/obj/item/projectile/test/in_chamber = new /obj/item/projectile/test(get_turf(src)) //Making the test.... + var/turf/curloc = get_turf(user) + var/turf/targloc = get_turf(target) + in_chamber.yo = targloc.y - curloc.y + in_chamber.xo = targloc.x - curloc.x + in_chamber.flags = flags //Set the flags... + in_chamber.pass_flags = pass_flags //And the pass flags to that of the real projectile... + var/output = in_chamber.fired() //Test it! + del(in_chamber) //No need for it anymore + return output //Send it back to the gun! + Bump(atom/A as mob|obj|turf|area) if(A == firer) loc = A.loc @@ -115,7 +129,7 @@ return 1 - process() + proc/fired() spawn while(src) if((!( current ) || loc == current)) current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) @@ -130,3 +144,30 @@ Bump(M) sleep(1) return + +/obj/item/projectile/test //Used to see if you can hit them. + invisibility = 101 //Nope! Can't see me! + yo = null + xo = null + var + turf/target = null + result = 0 //To pass the message back to the gun. + + Bump(atom/A as mob|obj|turf|area) + if(istype(A, /mob/living)) + result = 2 //We hit someone, return 1! + return ..() + + fired() + target = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge + while(!result) //Loop on through! + if(!step_towards(src,target)) //If we hit something... + if(!result) //And the var is not already set.... + result = 1 //Return 0 + break + else + var/mob/living/M = locate() in get_turf(src) + if(istype(M)) //If there is someting living... + result = 2 //Return 1 + break + return (result-1) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 477be0002a9..8e80b8a8024 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -9,7 +9,7 @@ var/ID = 0 var/main = 0 - process() + fired() main = 1 ID = rand(0,1000) var/first = 1 @@ -34,7 +34,6 @@ new_beam.icon_state = icon_state else first = 0 - processing_objects.Remove(src) return /obj/effect/effect/laserdealer diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index bb8f30ad3ff..21c37156057 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -15,6 +15,12 @@ stutter = 10 flag = "laser" //Give it a better chance to be blocked. + check_fire(var/mob/living/target as mob, var/mob/living/user as mob) + if((target.stunned + target.weakened) > 30) + return 2 + else + return ..() + /obj/item/projectile/energy/declone name = "\improper Decloner Bolt" diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index a0310e86609..1284a73b06a 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -174,6 +174,8 @@ afterattack(var/obj/target as obj, mob/user as mob) if(istype(target, /obj/structure/table) || istype(target, /obj/structure/rack) || istype(target,/obj/item/smallDelivery)) return + if(!istype(target,/obj)) + return if(target.anchored) return if(target in user) diff --git a/code/unused/hivebot/hud.dm b/code/unused/hivebot/hud.dm index cc33795f10a..29414fb51b4 100644 --- a/code/unused/hivebot/hud.dm +++ b/code/unused/hivebot/hud.dm @@ -217,6 +217,7 @@ mymob.blind.name = " " mymob.blind.screen_loc = "1,1 to 15,15" mymob.blind.layer = 0 + mymob.blind.mouse_opacity = 0 mymob.flash = new /obj/screen( null ) mymob.flash.icon = 'screen1_robot.dmi'