From 99321389f27b42982bd173ca857852c4b46430a8 Mon Sep 17 00:00:00 2001 From: Kilakk Date: Thu, 14 Nov 2013 21:45:25 -0500 Subject: [PATCH 01/36] Fixes #3886, ATMs no longer log you in automagically Silly security level 0 ruined everything Added a tiny sanity check as well to avoid runtimes --- code/modules/economy/ATM.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 32dc6cbc9d..398d311c18 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -97,8 +97,6 @@ log transactions user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005." return if(get_dist(src,user) <= 1) - //check to see if the user has low security enabled - scan_user(user) //js replicated from obj/machinery/computer/card var/dat = "

NanoTrasen Automatic Teller Machine

" @@ -223,7 +221,11 @@ log transactions var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0) authenticated_account.security_level = new_sec_level if("attempt_auth") - if(!ticks_left_locked_down) + + // check if they have low security enabled + scan_user(usr) + + if(!ticks_left_locked_down && held_card) var/tried_account_num = text2num(href_list["account_num"]) if(!tried_account_num) tried_account_num = held_card.associated_account_number @@ -363,3 +365,5 @@ log transactions T.date = current_date_string T.time = worldtime2text() authenticated_account.transaction_log.Add(T) + + view_screen = NO_SCREEN \ No newline at end of file From 734d89c669e1f078e40a589b91a8dabd5250ab64 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 15 Nov 2013 01:00:25 -0600 Subject: [PATCH 02/36] BugFix: Cult Ghosts...after a bit of professional advise from chinsky. Problem: Cult members can't use the rune to see ghosts, then beat ghosts over the head. it was being intercepted by _onclick and processed there and only displaying an angry red notice that you hit that ghost. Ghost didn't become visible, it disappeared soon after moving off the rune. Solution: Made an attackby for ghosts to check when they are being beat up by cultist with books, now they appear. Minor feature change: Now if a visible ghost gets hit it will give a different message than the standard "Ghost is pulled through from the other side". --- code/modules/mob/dead/observer/observer.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ae544c43d5..e06d7ed263 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -63,6 +63,23 @@ real_name = name ..() + +/mob/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/tome)) + var/mob/dead/M = src + if(src.invisibility != 0) + M.invisibility = 0 + user.visible_message( \ + "\red [user] drags ghost, [M], to our plan of reality!", \ + "\red You drag [M] to our plan of reality!" \ + ) + else + user.visible_message ( \ + "\red [user] just tried to smash his book into that ghost! It's not very effective", \ + "\red You get the feeling that the ghost can't become any more visible." \ + ) + + /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 1 /* From 4ccf7d0a08c9429065e6c0512ca61ef96a6fba9f Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 15 Nov 2013 22:01:35 -0600 Subject: [PATCH 03/36] Bugfix (3778) Power cells in exosuits have the same amount of power as a highcap cell Issue: Mechs are created/spawned with a high-capaciter cell that is named "Power cell" and confuses some of the less bright roboticists and their beards. Solution: Shave the roboticist, and also renamed the cell that spawns to properly reflect it's higher capacity. --- code/game/mecha/mecha.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1b47d6f9a9..65284a054d 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -115,6 +115,7 @@ cell = C return cell = new(src) + cell.name = "high-capacity power cell" cell.charge = 15000 cell.maxcharge = 15000 From ab06251c32a489d5705778e5afc5ada22e534a36 Mon Sep 17 00:00:00 2001 From: Nanai Date: Sat, 16 Nov 2013 02:01:16 -0500 Subject: [PATCH 04/36] Event Rebalance! As per request, events have been rebalanced to be a bit more even and vastly less appendicitis. Event timers have been increased from 15-25 minutes to 20-40 minutes. --- code/modules/events/event_dynamic.dm | 30 ++++++++++++++-------------- code/modules/events/event_manager.dm | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 93142e0261..8a5b3b61b2 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -44,39 +44,39 @@ var/list/event_last_fired = list() //see: // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm - possibleEvents[/datum/event/economic_event] = 200 - possibleEvents[/datum/event/trivial_news] = 300 - possibleEvents[/datum/event/mundane_news] = 200 + possibleEvents[/datum/event/economic_event] = 300 + possibleEvents[/datum/event/trivial_news] = 400 + possibleEvents[/datum/event/mundane_news] = 300 possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200) possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50) if(account_hack_attempted) possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200) - possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"] - possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"] + possibleEvents[/datum/event/carp_migration] = 20 + 10 * active_with_role["Engineer"] + possibleEvents[/datum/event/brand_intelligence] = 20 + 25 * active_with_role["Janitor"] - possibleEvents[/datum/event/rogue_drone] = 25 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] - possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"] + possibleEvents[/datum/event/rogue_drone] = 5 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] + possibleEvents[/datum/event/infestation] = 100 + 100 * active_with_role["Janitor"] possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25 possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5 - possibleEvents[/datum/event/grid_check] = 25 + 20 * active_with_role["Engineer"] - possibleEvents[/datum/event/electrical_storm] = 10 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] + possibleEvents[/datum/event/grid_check] = 25 + 10 * active_with_role["Engineer"] + possibleEvents[/datum/event/electrical_storm] = 15 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] possibleEvents[/datum/event/wallrot] = 30 * active_with_role["Engineer"] + 50 * active_with_role["Botanist"] if(!spacevines_spawned) - possibleEvents[/datum/event/spacevine] = 5 + 5 * active_with_role["Engineer"] + possibleEvents[/datum/event/spacevine] = 10 + 5 * active_with_role["Engineer"] if(minutes_passed >= 30) // Give engineers time to set up engine possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"] - possibleEvents[/datum/event/meteor_shower] = 40 * active_with_role["Engineer"] + possibleEvents[/datum/event/meteor_shower] = 20 * active_with_role["Engineer"] possibleEvents[/datum/event/blob] = 20 * active_with_role["Engineer"] - possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 100 + possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 15 if(active_with_role["Medical"] > 0) - possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 50 - possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 150 - possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 20 possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50 possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50 diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 89347a299d..52fbc8220a 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -2,8 +2,8 @@ var/list/allEvents = typesof(/datum/event) - /datum/event var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event //var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation -var/eventTimeLower = 9000 //15 minutes -var/eventTimeUpper = 15000 //25 minutes +var/eventTimeLower = 12000 //20 minutes +var/eventTimeUpper = 24000 //40 minutes var/scheduledEvent = null From 057eaba09e51110678952fe1b6f318bc94c58a36 Mon Sep 17 00:00:00 2001 From: Higgin Date: Sat, 16 Nov 2013 17:45:38 -0800 Subject: [PATCH 05/36] Changes to how projectiles work: take two! -Embedding is now a function of armor and projectile base damage. -Chances to hit varied body parts are modified via miss_modifier. Less likely to hit head, extremities, etc. Distance is more of a factor. --- .../mob/living/carbon/human/human_damage.dm | 11 --------- .../mob/living/carbon/human/human_defense.dm | 12 ++++++++++ code/modules/projectiles/projectile.dm | 23 +++++++++++++++++-- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 6b597920ff..40db476eba 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -251,15 +251,4 @@ This function restores all organs. H.drop_item() W.loc = src - else if(istype(used_weapon,/obj/item/projectile)) //We don't want to use the actual projectile item, so we spawn some shrapnel. - - var/obj/item/projectile/P = used_weapon - if(prob(75) && P.embed) - var/obj/item/weapon/shard/shrapnel/S = new() - S.name = "[P.name] shrapnel" - S.desc = "[S.desc] It looks like it was fired from [P.shot_from]." - S.loc = src - organ.implants += S - visible_message("The projectile sticks in the wound!") - S.add_blood(src) return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 2d06c5fee7..f34ad036d4 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -88,6 +88,18 @@ emp_act return //END TASER NERF + var/datum/organ/external/organ = get_organ(check_zone(def_zone)) + + var/armor = checkarmor(organ, "bullet") + + if((P.embed && prob(20 + max(P.damage - armor, -10))) && P.damage_type == BRUTE) + var/obj/item/weapon/shard/shrapnel/SP = new() + (SP.name) = "[P.name] shrapnel" + (SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]." + (SP.loc) = organ + organ.implants += SP + visible_message("The projectile sticks in the wound!") + SP.add_blood(src) return (..(P , def_zone)) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 97fa5b1dbd..3012a095cf 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -50,7 +50,6 @@ var/drowsy = 0 var/agony = 0 - var/embed = 0 // whether or not the projectile can embed itself in the mob proc/on_hit(var/atom/target, var/blocked = 0) if(blocked >= 2) return 0//Full block @@ -91,11 +90,31 @@ // close distance, actually RAISE the chance to hit. var/distance = get_dist(starting,loc) var/miss_modifier = -30 + if(isorgan(def_zone,M)) //modify chances to hit based on the area you're attacking. + if(def_zone == "l_arm") + miss_modifier += 10 + if(def_zone == "r_arm") + miss_modifier += 10 + if(def_zone == "l_leg") + miss_modifier += 5 + if(def_zone == "r_leg") + miss_modifier += 5 + if(def_zone == "head") + miss_modifier += 20 + if(def_zone == "l_hand") + miss_modifier += 25 + if(def_zone == "r_hand") + miss_modifier += 25 + if(def_zone == "l_foot") + miss_modifier += 23 + if(def_zone == "r_foot") + miss_modifier += 23 + if (istype(shot_from,/obj/item/weapon/gun)) //If you aim at someone beforehead, it'll hit more often. var/obj/item/weapon/gun/daddy = shot_from //Kinda balanced by fact you need like 2 seconds to aim if (daddy.target && original in daddy.target) //As opposed to no-delay pew pew miss_modifier += -30 - def_zone = get_zone_with_miss_chance(def_zone, M, -30 + 8*distance) + def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 15*distance) if(!def_zone) visible_message("\blue \The [src] misses [M] narrowly!") From f42ac118aaece3c2cfc1041a7c066f564d52b891 Mon Sep 17 00:00:00 2001 From: Higgin Date: Sat, 16 Nov 2013 21:21:40 -0800 Subject: [PATCH 06/36] Fix because I'm dumb. --- .../mob/living/carbon/human/human_defense.dm | 20 +++++++++---------- code/modules/projectiles/projectile.dm | 5 +---- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f34ad036d4..16a4733b27 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -88,18 +88,18 @@ emp_act return //END TASER NERF - var/datum/organ/external/organ = get_organ(check_zone(def_zone)) + var/datum/organ/external/organ = get_organ(check_zone(def_zone)) - var/armor = checkarmor(organ, "bullet") + var/armor = checkarmor(organ, "bullet") - if((P.embed && prob(20 + max(P.damage - armor, -10))) && P.damage_type == BRUTE) - var/obj/item/weapon/shard/shrapnel/SP = new() - (SP.name) = "[P.name] shrapnel" - (SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]." - (SP.loc) = organ - organ.implants += SP - visible_message("The projectile sticks in the wound!") - SP.add_blood(src) + if((P.embed && prob(20 + max(P.damage - armor, -10))) && P.damage_type == BRUTE) + var/obj/item/weapon/shard/shrapnel/SP = new() + (SP.name) = "[P.name] shrapnel" + (SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]." + (SP.loc) = organ + organ.implants += SP + visible_message("The projectile sticks in the wound!") + SP.add_blood(src) return (..(P , def_zone)) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3012a095cf..1598a261fe 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -49,7 +49,7 @@ var/eyeblur = 0 var/drowsy = 0 var/agony = 0 - + var/embed = 0 // whether or not the projectile can embed itself in the mob proc/on_hit(var/atom/target, var/blocked = 0) if(blocked >= 2) return 0//Full block @@ -86,11 +86,8 @@ loc = A.loc return 0// nope.avi - //Lower accurancy/longer range tradeoff. Distance matters a lot here, so at - // close distance, actually RAISE the chance to hit. var/distance = get_dist(starting,loc) var/miss_modifier = -30 - if(isorgan(def_zone,M)) //modify chances to hit based on the area you're attacking. if(def_zone == "l_arm") miss_modifier += 10 if(def_zone == "r_arm") From 08a3226f0794405984e74c522b67ab0b86d1a675 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sun, 17 Nov 2013 15:03:50 +0000 Subject: [PATCH 07/36] Fix for the config .gitignore. Signed-off-by: Mloc-Argent --- .gitignore | 6 ------ config/.gitignore | 3 +++ 2 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 config/.gitignore diff --git a/.gitignore b/.gitignore index 0dc17248d0..7daab15618 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,3 @@ *.rsc *.dmb *.lk - -#ignore any files in config/, except those in subdirectories. -/config/* -!/config/*/* - -/baystation12.int diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 0000000000..ec7ed9b452 --- /dev/null +++ b/config/.gitignore @@ -0,0 +1,3 @@ +#ignore everything here, except subdirectories. +* +!*/ From 1583eb437fa2909b95bf3e31dde21edd3afc9f5e Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sun, 17 Nov 2013 17:28:50 +0000 Subject: [PATCH 08/36] Updated HUD Icons Was using some rather outdated icons. Copied the icons from mob.dmi and named them appropriately. --- icons/mob/hud.dmi | Bin 2660 -> 2902 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index b13b296cf1075606e11bfc457faa67ca471c75b7..0502c01147dccacc311e72977314974e725be839 100644 GIT binary patch delta 2617 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 E0T4^!eE|59*YkNk@39~GYWYa8Le&8<(lA%T zX0t&A0lGl~_T9#2xN3tyAaJ}V)(eE5n+OGgq~veY!J5E|m%6Y;gIl*Z`R%1}v$dwK zQ_r25{pX5KxMGV?;`thgb&$--4FF{*_NRI1{nC9WoUA9WrnHDTUG6i%2t)517f}xj%Y0PE zMtxjV=j%A{!yj^t%xbWE(rmDu$QQ$B54j1hQx_v%_?H~sJCR*o(t*_^zTspto8h>h zo_<^eE*$$6XP6N%gK>2j`IP1*bKzBoe?N7Na1;Vieu}t_r^4e=hW!WHw0z%X;B}b#fulSAY zM4Ov2{P#VmDr2(lUbI&|s`ahNV z{SbvJ3tDJ3m=M_*`?iU~cJz5idv;Xpi;%~(oUiw;k3zRD9gjkPj0kzu41nJg{OZTY z$9R;bhA_S$Ff}At4>2;noErQGWHNrK^S08w-)x7mmrT4QH)$2@kgMh~yX9CwSvqtX zZ4vejp5>>z3Oh&+Z7=aV2GmXj?BDr}|4-3#rJb~SzHQ0o#(0U5F<$A(+*K?#@?}?OWA|S( z&%Zf+1&hlHl;(?bLL0Ut9ZxdeTv!xNP#(` z*m4P?Y8{dt1udAy9P^G;%^$(U(C@Hl^krqh-05yI)oQ+uJ6AG>WPBxh^uO;N*B?dP5RK)gezo2b-IYp6N=WwvSglUX)`1G3Di)Rd3sKF1 zbjqZdvsjOi=e4}q{praS31u-@$A}>&rUc4`zm!2fCVN=-p^8=U?uN!JzOWOb>t~>& z{TeNN%EL?wptW}T;8(2VQ&ZFNl*}Ni-J@v8Eo=HadA&+2`@6J4xaT>_UAXB6JdyR; z+0Jd3kJiO5?K3ptiqBU*}ur`&joMZOv8nh=Q!dJWW^ zzQu;3q;yRvb{6PWn3c8}$ZNOM2t@Z5Bw`8#Y^ zos)YF-1CM{0cHNz6KQGiQ7ImFM3!&Sw>Vvyf4r|x#y)+H@xg`!s(E$x=|S0=VN7y> zBAstFXs(???oqzFDF<$A9zdR%L=v>MFT;DH32m<+-!m0n|2Fez4Op+%TY1Y2u+>AA zCQNPdhL$PR2S|R}vZr447@Bi}9rz_x!~Kb$u80W>~F@ zt(*w9B~DrXdA$kI7Ye;_!0d}Ocm)ioB%E=44aG&`>xKIe9voTTEF=PMX(@Z=Bx7!S zXo$S?|1&ddYipeD39*uJJ7aOXH&MO6mn{!^78equrNSj>)3`Ec!xQU9@`b?q3V!n3SB4Q>JO(;tk2lZGfXpS_NBC* z<8qq{%(lHM4);iC>OER}zjb&WrQJn0>OPixW{TRQ8S+0{dOF38cJ~K9Bx_NIo(9jV zJ`U$z>Uwp}`cw2YF&~J(=Pv3wGprwCLvPHu@PW0N46`4-e^ToEQ*7|L)YPS8GnK5% zO0s(b8d=OVk?}$=kYV@niHtyUr>;6XTLnnFTpc5~K6tlt`X=3w|3mU-UcbSb;Omi2 z7Rxm}@v5%AsphV_)8VFq+~E}V8?SrrozE+0fDqrC%F5~7=6(2Mk_iY8azybNo8tM} zwk{(LKG_f(JDv`2x<7E3;2cep)4E0MZ3sli(8=n-afpk08Y6UDYH}}&B_*$Crripu z)G7MHXw%3UmOiR_qr?)rTW*kaaZY%@oHlo;v*|X|v`-L9H?h>d^l_~4+HXl3HG6&q zlAdVcF4uhPUuH`z59gYGj}7u6&i)oCuG8oyo9LU8SL@!vbhH(3sDs#~M{Za=rTKzC;Dg()Rca%NZa4vD1fx2R;cDVU|F)ygl?{>K_w5KO8t)!$ WH&IcnHN%hoyVb=3Yu|7x==wi6xMHOM From dbf24606bd87268e8f5487afcd5bb03282db5d6f Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 17 Nov 2013 08:24:23 -0600 Subject: [PATCH 09/36] The Ghost AntagHUD Feature. Created configurations for Server Admins to be able to toggle it within default config. Modified my previous AdminVerb that allows respawns to bypass the limitations of the restrictions while also letting the admins know if the ghost has used AntagHUD Created restriction checks for various forms of joining the round and if administrators/hosts have restricted AntagHUD users from joining the round they will not be able to. To Do: Create Adminverb for toggling restrictions to also be able to toggle everyones ability to use antagHUD for a round. Create a method for "Job Banning" users from using antagHUD. --- code/controllers/configuration.dm | 8 +- code/modules/admin/verbs/randomverbs.dm | 18 +++-- code/modules/mob/dead/observer/observer.dm | 81 ++++++++++++++++++- .../mob/living/carbon/brain/posibrain.dm | 2 + .../modules/mob/living/silicon/pai/recruit.dm | 2 + code/modules/mob/mob.dm | 5 ++ config/example/config.txt | 6 ++ 7 files changed, 114 insertions(+), 8 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 42ac1cdc97..f2b5f01ce3 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -43,7 +43,8 @@ var/Tickcomp = 0 var/socket_talk = 0 // use socket_talk to communicate with other processes var/list/resource_urls = null - + var/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. + var/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. var/list/mode_names = list() var/list/modes = list() // allowed modes var/list/votable_modes = list() // votable modes @@ -385,6 +386,11 @@ if("ticklag") Ticklag = text2num(value) + if("allow_antag_hud") + config.antag_hud_allowed = 1 + if("antag_hud_restricted") + config.antag_hud_restricted = 1 + if("socket_talk") socket_talk = text2num(value) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 3447d70e67..6a5af5cf25 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -229,7 +229,7 @@ Ccomp's first proc. /client/proc/allow_character_respawn() set category = "Special Verbs" set name = "Allow player to respawn" - set desc = "Let's the player bypass the 30 minute wait to respawn." + set desc = "Let's the player bypass the 30 minute wait to respawn or allow them to re-enter their corpse." if(!holder) src << "Only administrators may use this command." var/any = 0 @@ -252,14 +252,20 @@ Ccomp's first proc. src << "Hrm, appears you didn't select a ghost" // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error. return - var/mob/M = ghosts[target] - M.timeofdeath=-19999 /* time of death is checked in /mob/verb/abandon_mob() which is the Respawn verb. + var/mob/dead/observer/G = ghosts[target] + if(G.has_enabled_antagHUD && config.antag_hud_restricted) + var/response = alert(src, "Are you sure you wish to allow this individual to play?","Ghost has used AntagHUD","Yes","No") + if(response == "No") return + G.timeofdeath=-19999 /* time of death is checked in /mob/verb/abandon_mob() which is the Respawn verb. timeofdeath is used for bodies on autopsy but since we're messing with a ghost I'm pretty sure there won't be an autopsy. */ - M:show_message(text("\blue You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead."), 1) - log_admin("[key_name(usr)] allowed [key_name(M)] to bypass the 30 minute respawn limit") - message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(M)] to bypass the 30 minute respawn limit", 1) + G.has_enabled_antagHUD = 2 + G.can_reenter_corpse = 1 + + G:show_message(text("\blue You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead."), 1) + log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 30 minute respawn limit") + message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit", 1) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ae544c43d5..9df4b8a84c 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -16,6 +16,8 @@ var/started_as_observer //This variable is set to 1 when you enter the game as an observer. //If you died in the game and are a ghsot - this will remain as null. //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/has_enabled_antagHUD = 0 + var/antagHUD = 0 universal_speak = 1 var/atom/movable/following = null /mob/dead/observer/New(mob/body) @@ -70,6 +72,60 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body Works together with spawning an observer, noted above. */ +/mob/dead/observer/Life() + ..() + if(!loc) return + if(!client) return 0 + + + if(client.images.len) + for(var/image/hud in client.images) + if(copytext(hud.icon_state,1,4) == "hud") + client.images.Remove(hud) + if(M.antagHUD) + var/list/target_list = list() + for(var/mob/living/target in oview(M)) + if( target.mind&&(target.mind.special_role||issilicon(target)) ) + target_list += target + if(target_list.len) + M.assess_targets(target_list, M) + + + +/mob/dead/proc/assess_targets(list/target_list, mob/living/carbon/U) + var/icon/tempHud = 'icons/mob/hud.dmi' + for(var/mob/living/target in target_list) + if(iscarbon(target)) + switch(target.mind.special_role) + if("traitor","Syndicate") + U.client.images += image(tempHud,target,"hudsyndicate") + if("Revolutionary") + U.client.images += image(tempHud,target,"hudrevolutionary") + if("Head Revolutionary") + U.client.images += image(tempHud,target,"hudheadrevolutionary") + if("Cultist") + U.client.images += image(tempHud,target,"hudcultist") + if("Changeling") + U.client.images += image(tempHud,target,"hudchangeling") + if("Wizard","Fake Wizard") + U.client.images += image(tempHud,target,"hudwizard") + if("Hunter","Sentinel","Drone","Queen") + U.client.images += image(tempHud,target,"hudalien") + if("Death Commando") + U.client.images += image(tempHud,target,"huddeathsquad") + if("Ninja") + U.client.images += image(tempHud,target,"hudninja") + else//If we don't know what role they have but they have one. + U.client.images += image(tempHud,target,"hudunknown1") + else//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud. + var/mob/living/silicon/silicon_target = target + if(!silicon_target.laws||(silicon_target.laws&&(silicon_target.laws.zeroth||!silicon_target.laws.inherent.len))||silicon_target.mind.special_role=="traitor") + if(isrobot(silicon_target))//Different icons for robutts and AI. + U.client.images += image(tempHud,silicon_target,"hudmalborg") + else + U.client.images += image(tempHud,silicon_target,"hudmalai") + return 1 + /mob/proc/ghostize(var/can_reenter_corpse = 1) if(key) var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc. @@ -153,7 +209,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients usr << "Another consciousness is in your body...It is resisting you." return - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). var/obj/effect/rune/R = locate() in mind.current.loc //whilst corpse is alive, we can only reenter the body if it's on the rune if(!(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"])) //astral journeying rune usr << "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you." @@ -162,6 +218,29 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp mind.current.key = key return 1 +/mob/dead/observer/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + if(!config.antag_hud_allowed) + src << "\red Admins have disabled this for this round." + return + if(!client) + return + var/mob/dead/observer/M = src + if(config.antag_hud_restricted && !M.has_enabled_antagHUD) + var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") + if(response == "No") return + M.can_reenter_corpse = 0 + if(!M.has_enabled_antagHUD) + M.has_enabled_antagHUD = 1 + if(M.antagHUD) + M.antagHUD = 0 + src << "\blue AntagHUD Disabled" + else + M.antagHUD = 1 + src << "\blue AntagHUD Enabled" + /mob/dead/observer/proc/dead_tele() set category = "Ghost" set name = "Teleport" diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index f8c014278c..fa02150ab3 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -27,6 +27,8 @@ proc/request_player() for(var/mob/dead/observer/O in player_list) + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + continue if(jobban_isbanned(O, "pAI")) continue if(O.client) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 93271aadaf..270e2ba763 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -191,6 +191,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates proc/requestRecruits() for(var/mob/dead/observer/O in player_list) + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + continue if(jobban_isbanned(O, "pAI")) continue if(asked.Find(O.key)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 8f9623565f..c82489cf35 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -348,6 +348,10 @@ var/list/slot_equipment_priority = list( \ return else var/deathtime = world.time - src.timeofdeath + var/mob/dead/observer/G = src + if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + usr << "\blue Upon using the antagHUD you forfeighted the ability to join the round." + return var/deathtimeminutes = round(deathtime / 600) var/pluralcheck = "minute" if(deathtimeminutes == 0) @@ -358,6 +362,7 @@ var/list/slot_equipment_priority = list( \ pluralcheck = " [deathtimeminutes] minutes and" var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1) usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds." + if (deathtime < 18000) usr << "You must wait 30 minutes to respawn!" return diff --git a/config/example/config.txt b/config/example/config.txt index db1702b67c..fb320da581 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -121,6 +121,12 @@ VOTE_AUTOTRANSFER_INTERVAL 36000 ## players' votes default to "No vote" (otherwise, default to "No change") DEFAULT_NO_VOTE +## Allow ghosts to see antagonist through AntagHUD +ALLOW_ANTAG_HUD + +## If ghosts use antagHUD they are no longer allowed to join the round. +ANTAG_HUD_RESTRICTED + ## allow AI job ALLOW_AI From a56103c151310efd04d319db3e0190b132d54f9d Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 17 Nov 2013 10:00:12 -0600 Subject: [PATCH 10/36] Added Adminverbs for turning off and on the various items needed. Also added the proc get_ghosts() with 2 versions of output, it defaults to returning a mob list but can be set to return a list for use with an input window. --- code/modules/admin/admin_verbs.dm | 2 + code/modules/admin/verbs/randomverbs.dm | 96 ++++++++++++++++++---- code/modules/mob/dead/observer/observer.dm | 19 +++-- 3 files changed, 94 insertions(+), 23 deletions(-) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 606a6e82ff..1158633bf8 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -70,6 +70,8 @@ var/list/admin_verbs_admin = list( /client/proc/man_up, /client/proc/global_man_up, /client/proc/response_team, // Response Teams admin verb + /client/proc/toggle_antagHUD_use, + /client/proc/toggle_antagHUD_restrictions, /client/proc/allow_character_respawn /* Allows a ghost to respawn */ ) var/list/admin_verbs_ban = list( diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 6a5af5cf25..010e99e23e 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -226,26 +226,38 @@ Allow admins to set players to be able to respawn/bypass 30 min wait, without th Ccomp's first proc. */ +/client/proc/get_ghosts(var/notify = 0,var/what = 2) + // what = 1, return ghosts ass list. + // what = 2, return mob list + + var/list/mobs = list() + var/list/ghosts = list() + var/list/sortmob = sortAtom(mob_list) // get the mob list. + /var/any=0 + for(var/mob/dead/observer/M in sortmob) + mobs.Add(M) //filter it where it's only ghosts + any = 1 //if no ghosts show up, any will just be 0 + if(!any) + if(notify) + src << "There doesn't appear to be any ghosts for you to select." + return + + for(var/mob/M in mobs) + var/name = M.name + ghosts[name] = M //get the name of the mob for the popup list + if(what==1) + return ghosts + else + return mobs + + /client/proc/allow_character_respawn() set category = "Special Verbs" set name = "Allow player to respawn" set desc = "Let's the player bypass the 30 minute wait to respawn or allow them to re-enter their corpse." if(!holder) src << "Only administrators may use this command." - var/any = 0 - var/list/mobs = list() - var/list/ghosts = list() - var/list/sortmob = sortAtom(mob_list) // get the mob list. - for(var/mob/dead/observer/M in sortmob) - mobs.Add(M) //filter it where it's only ghosts - any = 1 //if no ghosts show up, any will just be 0 - if(!any) - src << "There doesn't appear to be any ghosts for you to select." - return - - for(var/mob/M in mobs) - var/name = M.name - ghosts[name] = M //get the name of the mob for the popup list + var/list/ghosts= get_ghosts(1) var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts if(!target) @@ -268,6 +280,62 @@ Ccomp's first proc. message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit", 1) +/client/proc/toggle_antagHUD_use() + set category = "Server" + set name = "Toggle antagHUD usage" + set desc = "Toggles antagHUD usage for observers" + + if(!holder) + src << "Only administrators may use this command." + var/action="" + if(config.antag_hud_allowed) + for(var/mob/dead/observer/g in get_ghosts()) + if(g.antagHUD) + g.antagHUD = 0 // Disable it on those that have it enabled + g.has_enabled_antagHUD = 2 // We'll allow them to respawn + g << "\red TheAdministrator has disabled AntagHUD " + config.antag_hud_allowed = 0 + src << "\red AntagHUD usage has been disabled" + action = "disabled" + else + for(var/mob/dead/observer/g in get_ghosts()) + g << "\blue The Administrator has enabled AntagHUD " // Notify all observers they can now use AntagHUD + config.antag_hud_allowed = 1 + action = "enabled" + src << "\blue AntagHUD usage has been enabled" + + + log_admin("[key_name(usr)] has [action] antagHUD usage for observers") + message_admins("Admin [key_name_admin(usr)] has [action] antagHUD usage for observers", 1) + + + +/client/proc/toggle_antagHUD_restrictions() + set category = "Server" + set name = "Toggle antagHUD Restrictions" + set desc = "Restricts players that have used antagHUD from being able to join this round." + if(!holder) + src << "Only administrators may use this command." + var/action="" + if(config.antag_hud_restricted) + for(var/mob/dead/observer/g in get_ghosts()) + g << "\blue The administrator has lifted restrictions on joining the round if you use AntagHUD" + action = "lifted restrictions" + config.antag_hud_restricted = 0 + src << "\blue AntagHUD restrictions have been lifted" + else + for(var/mob/dead/observer/g in get_ghosts()) + g << "\red The administrator has placed restrictions on joining the round if you use AntagHUD" + g << "\red Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions " + g.antagHUD = 0 + g.has_enabled_antagHUD = 0 + action = "placed restrictions" + config.antag_hud_restricted = 1 + src << "\red AntagHUD restrictions have been enabled" + + log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD") + message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) + diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9df4b8a84c..7febbd4561 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -79,16 +79,17 @@ Works together with spawning an observer, noted above. if(client.images.len) - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") - client.images.Remove(hud) + for(var/image/hud in client.images) + if(copytext(hud.icon_state,1,4) == "hud") + client.images.Remove(hud) + var/mob/dead/observer/M = src if(M.antagHUD) - var/list/target_list = list() - for(var/mob/living/target in oview(M)) - if( target.mind&&(target.mind.special_role||issilicon(target)) ) - target_list += target - if(target_list.len) - M.assess_targets(target_list, M) + var/list/target_list = list() + for(var/mob/living/target in oview(M)) + if( target.mind&&(target.mind.special_role||issilicon(target)) ) + target_list += target + if(target_list.len) + M.assess_targets(target_list, M) From 59bb2357b67cf35864a6b757c685ce563595cb52 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 17 Nov 2013 10:41:07 -0600 Subject: [PATCH 11/36] Included JobBan menu and systems for AntagHUD --- code/modules/admin/topic.dm | 10 +++++++--- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 3 +++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f1c911488a..f545283038 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -515,7 +515,7 @@ //Non-Human (Green) counter = 0 jobs += "" - jobs += "" + jobs += "" for(var/jobPos in nonhuman_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -533,11 +533,15 @@ counter = 0 //pAI isn't technically a job, but it goes in here. + if(jobban_isbanned(M, "pAI")) jobs += "" else jobs += "" - + if(jobban_isbanned(M, "AntagHUD")) + jobs += "" + else + jobs += "" jobs += "
Non-human Positions
Non-human Positions
pAIpAIAntagHUDAntagHUD
" //Antagonist (Orange) @@ -2594,4 +2598,4 @@ show_player_info(ckey) if("list") PlayerNotesPage(text2num(href_list["index"])) - return \ No newline at end of file + return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 010e99e23e..55322914ed 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -257,7 +257,7 @@ Ccomp's first proc. set desc = "Let's the player bypass the 30 minute wait to respawn or allow them to re-enter their corpse." if(!holder) src << "Only administrators may use this command." - var/list/ghosts= get_ghosts(1) + var/list/ghosts= get_ghosts(1,1) var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts if(!target) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7febbd4561..a72fe75ef9 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -229,6 +229,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!client) return var/mob/dead/observer/M = src + if(jobban_isbanned(M, "AntagHUD")) + src << "\red You have been banned from using this feature" + return if(config.antag_hud_restricted && !M.has_enabled_antagHUD) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") if(response == "No") return From 340532dc55cec30ae31dee86ff650f6ce5c202ca Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 17 Nov 2013 13:16:55 -0600 Subject: [PATCH 12/36] String fix on adminverb Added holder checks so admins can use antagHUD regardless of restrictions. --- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 24 ++++++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 55322914ed..812a4b51d6 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -293,7 +293,7 @@ Ccomp's first proc. if(g.antagHUD) g.antagHUD = 0 // Disable it on those that have it enabled g.has_enabled_antagHUD = 2 // We'll allow them to respawn - g << "\red TheAdministrator has disabled AntagHUD " + g << "\red The Administrator has disabled AntagHUD " config.antag_hud_allowed = 0 src << "\red AntagHUD usage has been disabled" action = "disabled" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index a72fe75ef9..29148682b4 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -10,6 +10,7 @@ blinded = 0 anchored = 1 // don't get pushed around invisibility = INVISIBILITY_OBSERVER + var/tempdir = 1 var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 @@ -94,26 +95,27 @@ Works together with spawning an observer, noted above. /mob/dead/proc/assess_targets(list/target_list, mob/living/carbon/U) + var/mob/dead/observer/M = src var/icon/tempHud = 'icons/mob/hud.dmi' for(var/mob/living/target in target_list) if(iscarbon(target)) switch(target.mind.special_role) if("traitor","Syndicate") - U.client.images += image(tempHud,target,"hudsyndicate") + U.client.images += image(tempHud,target,"hudsyndicate",,M.tempdir) if("Revolutionary") - U.client.images += image(tempHud,target,"hudrevolutionary") + U.client.images += image(tempHud,target,"hudrevolutionary",,M.tempdir) if("Head Revolutionary") - U.client.images += image(tempHud,target,"hudheadrevolutionary") + U.client.images += image(tempHud,target,"hudheadrevolutionary",,M.tempdir) if("Cultist") - U.client.images += image(tempHud,target,"hudcultist") + U.client.images += image(tempHud,target,"hudcultist",,M.tempdir) if("Changeling") - U.client.images += image(tempHud,target,"hudchangeling") + U.client.images += image(tempHud,target,"hudchangeling",,M.tempdir) if("Wizard","Fake Wizard") - U.client.images += image(tempHud,target,"hudwizard") + U.client.images += image(tempHud,target,"hudwizard",,M.tempdir) if("Hunter","Sentinel","Drone","Queen") - U.client.images += image(tempHud,target,"hudalien") + U.client.images += image(tempHud,target,"hudalien",,M.tempdir) if("Death Commando") - U.client.images += image(tempHud,target,"huddeathsquad") + U.client.images += image(tempHud,target,"huddeathsquad",,M.tempdir) if("Ninja") U.client.images += image(tempHud,target,"hudninja") else//If we don't know what role they have but they have one. @@ -223,7 +225,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set category = "Ghost" set name = "Toggle AntagHUD" set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - if(!config.antag_hud_allowed) + if(!config.antag_hud_allowed && !client.holder) src << "\red Admins have disabled this for this round." return if(!client) @@ -232,11 +234,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(jobban_isbanned(M, "AntagHUD")) src << "\red You have been banned from using this feature" return - if(config.antag_hud_restricted && !M.has_enabled_antagHUD) + if(config.antag_hud_restricted && !M.has_enabled_antagHUD &&!client.holder) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") if(response == "No") return M.can_reenter_corpse = 0 - if(!M.has_enabled_antagHUD) + if(!M.has_enabled_antagHUD && !client.holder) M.has_enabled_antagHUD = 1 if(M.antagHUD) M.antagHUD = 0 From b75380985e273f172653cd9115b77a31e216c62e Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Sun, 17 Nov 2013 11:54:43 -0800 Subject: [PATCH 13/36] Using a better method to handle autotransfers. Old method was silly. --- baystation12.dme | 1 + code/controllers/voting.dm | 1 - code/game/gamemodes/gameticker.dm | 14 -------------- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index a5cf03ea1e..aaf9eab8af 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -75,6 +75,7 @@ #include "code\ATMOSPHERICS\components\unary\vent_pump.dm" #include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" #include "code\controllers\_DynamicAreaLighting_TG.dm" +#include "code\controllers\autotransfer.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" #include "code\controllers\lighting_controller.dm" diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 452c174b35..92f55a3fd6 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -50,7 +50,6 @@ datum/controller/vote initiate_vote("crew_transfer","the server") log_debug("The server has called an Autotransfer") - proc/reset() initiator = null time_remaining = 0 diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index a03068371f..ea9fbaec4a 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -36,8 +36,6 @@ var/global/datum/controller/gameticker/ticker var/triai = 0//Global holder for Triumvirate - var/initialtpass = 0 //holder for inital autotransfer vote timer - /datum/controller/gameticker/proc/pregame() login_music = pick(\ /*'sound/music/halloween/skeletons.ogg',\ @@ -63,17 +61,6 @@ var/global/datum/controller/gameticker/ticker current_state = GAME_STATE_SETTING_UP while (!setup()) -/datum/controller/gameticker/proc/votetimer() - var/timerbuffer = 0 - if (initialtpass == 0) - timerbuffer = config.vote_autotransfer_initial - else - timerbuffer = config.vote_autotransfer_interval - spawn(timerbuffer) - vote.autotransfer() - initialtpass = 1 - votetimer() - /datum/controller/gameticker/proc/setup() //Create and announce mode @@ -166,7 +153,6 @@ var/global/datum/controller/gameticker/ticker spawn(3000) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE - votetimer() return 1 /datum/controller/gameticker From 9936a9251facf2a923c0f5a53984bf6450488f0a Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Sun, 17 Nov 2013 11:55:57 -0800 Subject: [PATCH 14/36] Helps to add the actual new file. --- code/controllers/autotransfer.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 code/controllers/autotransfer.dm diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm new file mode 100644 index 0000000000..c69290c7bd --- /dev/null +++ b/code/controllers/autotransfer.dm @@ -0,0 +1,13 @@ +var/datum/controller/transfer_controller = new /transfer_controller() +var/timerbuffer = 0 //buffer for time check +/transfer_controller/New() + timerbuffer = config.vote_autotransfer_initial + processing_objects += src + +/transfer_controller/Del() + processing_objects -= src + +/transfer_controller/proc/process() + if (world.time >= timerbuffer - 600) + vote.autotransfer() + timerbuffer = timerbuffer + config.vote_autotransfer_interval \ No newline at end of file From 513953b92716f6ec71cfa0e8a6067c9b81f2e7d0 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 19 Nov 2013 01:10:59 -0600 Subject: [PATCH 15/36] Cleanup: Removed unneeded variables and a debug variable. --- code/modules/mob/dead/observer/observer.dm | 27 ++++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 29148682b4..a54b8ad96a 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -10,7 +10,6 @@ blinded = 0 anchored = 1 // don't get pushed around invisibility = INVISIBILITY_OBSERVER - var/tempdir = 1 var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 @@ -83,39 +82,37 @@ Works together with spawning an observer, noted above. for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") client.images.Remove(hud) - var/mob/dead/observer/M = src - if(M.antagHUD) + if(antagHUD) var/list/target_list = list() - for(var/mob/living/target in oview(M)) + for(var/mob/living/target in oview(src)) if( target.mind&&(target.mind.special_role||issilicon(target)) ) target_list += target if(target_list.len) - M.assess_targets(target_list, M) + assess_targets(target_list, src) -/mob/dead/proc/assess_targets(list/target_list, mob/living/carbon/U) - var/mob/dead/observer/M = src +/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) var/icon/tempHud = 'icons/mob/hud.dmi' for(var/mob/living/target in target_list) if(iscarbon(target)) switch(target.mind.special_role) if("traitor","Syndicate") - U.client.images += image(tempHud,target,"hudsyndicate",,M.tempdir) + U.client.images += image(tempHud,target,"hudsyndicate") if("Revolutionary") - U.client.images += image(tempHud,target,"hudrevolutionary",,M.tempdir) + U.client.images += image(tempHud,target,"hudrevolutionary") if("Head Revolutionary") - U.client.images += image(tempHud,target,"hudheadrevolutionary",,M.tempdir) + U.client.images += image(tempHud,target,"hudheadrevolutionary") if("Cultist") - U.client.images += image(tempHud,target,"hudcultist",,M.tempdir) + U.client.images += image(tempHud,target,"hudcultist") if("Changeling") - U.client.images += image(tempHud,target,"hudchangeling",,M.tempdir) + U.client.images += image(tempHud,target,"hudchangeling") if("Wizard","Fake Wizard") - U.client.images += image(tempHud,target,"hudwizard",,M.tempdir) + U.client.images += image(tempHud,target,"hudwizard") if("Hunter","Sentinel","Drone","Queen") - U.client.images += image(tempHud,target,"hudalien",,M.tempdir) + U.client.images += image(tempHud,target,"hudalien") if("Death Commando") - U.client.images += image(tempHud,target,"huddeathsquad",,M.tempdir) + U.client.images += image(tempHud,target,"huddeathsquad") if("Ninja") U.client.images += image(tempHud,target,"hudninja") else//If we don't know what role they have but they have one. From 7be20c098614d02fbdb2332d4a11a39b5bd7b04e Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 19 Nov 2013 05:36:40 -0600 Subject: [PATCH 16/36] AntagHUD's player verbs will now disappear from the players view if disabled by admin or by configuration options. Poor guys won't know what they are missing! Admins/Mods will still have the verb viewable. --- code/modules/admin/verbs/randomverbs.dm | 8 ++++++-- code/modules/mob/dead/observer/observer.dm | 3 +++ code/modules/mob/new_player/new_player.dm | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 812a4b51d6..1f5b3181bf 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -290,15 +290,19 @@ Ccomp's first proc. var/action="" if(config.antag_hud_allowed) for(var/mob/dead/observer/g in get_ghosts()) + if(!g.client.holder) //Remove the verb from non-admin ghosts + g.verbs -= /mob/dead/observer/verb/toggle_antagHUD if(g.antagHUD) - g.antagHUD = 0 // Disable it on those that have it enabled - g.has_enabled_antagHUD = 2 // We'll allow them to respawn + g.antagHUD = 0 // Disable it on those that have it enabled + g.has_enabled_antagHUD = 2 // We'll allow them to respawn g << "\red The Administrator has disabled AntagHUD " config.antag_hud_allowed = 0 src << "\red AntagHUD usage has been disabled" action = "disabled" else for(var/mob/dead/observer/g in get_ghosts()) + if(!g.client.holder) // Add the verb back for all non-admin ghosts + g.verbs += /mob/dead/observer/verb/toggle_antagHUD g << "\blue The Administrator has enabled AntagHUD " // Notify all observers they can now use AntagHUD config.antag_hud_allowed = 1 action = "enabled" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index a54b8ad96a..c74a0e0fcc 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -25,6 +25,7 @@ see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 verbs += /mob/dead/observer/proc/dead_tele + stat = DEAD var/turf/T @@ -132,6 +133,8 @@ Works together with spawning an observer, noted above. ghost.can_reenter_corpse = can_reenter_corpse ghost.timeofdeath = src.timeofdeath //BS12 EDIT ghost.key = key + if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost /* diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 77b4dbd884..6237803638 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -114,6 +114,7 @@ spawning = 1 src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo + observer.started_as_observer = 1 close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") @@ -129,8 +130,11 @@ client.prefs.real_name = random_name(client.prefs.gender) observer.real_name = client.prefs.real_name observer.name = observer.real_name + if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + observer.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! observer.key = key del(src) + return 1 if(href_list["late_join"]) From 46218e71f182a47ea70443c277144509ff7dc879 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 19 Nov 2013 05:44:39 -0600 Subject: [PATCH 17/36] Bugfix: AntagHUD, need to remove verbs from correct object --- code/modules/mob/dead/observer/observer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c74a0e0fcc..086e7949db 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -134,7 +134,7 @@ Works together with spawning an observer, noted above. ghost.timeofdeath = src.timeofdeath //BS12 EDIT ghost.key = key if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost /* From c13f57613cd7b700294fc532fb255776653cf9fa Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 19 Nov 2013 19:23:51 -0800 Subject: [PATCH 18/36] Changes Telescience to Projectile Trajectory! --- baystation12.dme | 1 + code/__HELPERS/game.dm | 38 ++ code/modules/research/designs.dm | 10 + code/modules/telesci/bscrystal.dm | 38 ++ code/modules/telesci/gps.dm | 26 +- code/modules/telesci/telepad.dm | 37 +- code/modules/telesci/telesci_computer.dm | 477 ++++++++++++----------- icons/obj/telescience.dmi | Bin 2080 -> 2171 bytes 8 files changed, 363 insertions(+), 264 deletions(-) create mode 100644 code/modules/telesci/bscrystal.dm diff --git a/baystation12.dme b/baystation12.dme index 35a7237aa1..ab063aadea 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1241,6 +1241,7 @@ #include "code\modules\surgery\ribcage.dm" #include "code\modules\surgery\robolimbs.dm" #include "code\modules\surgery\surgery.dm" +#include "code\modules\telesci\bscrystal.dm" #include "code\modules\telesci\gps.dm" #include "code\modules\telesci\telepad.dm" #include "code\modules\telesci\telesci_computer.dm" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 0b535a44c3..8da220bf67 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -327,3 +327,41 @@ proc/isInSight(var/atom/A, var/atom/B) spawn(delay) for(var/client/C in group) C.screen -= O + +datum/projectile_data + var/src_x + var/src_y + var/time + var/distance + var/power_x + var/power_y + var/dest_x + var/dest_y + +/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ + var/power_x, var/power_y, var/dest_x, var/dest_y) + src.src_x = src_x + src.src_y = src_y + src.time = time + src.distance = distance + src.power_x = power_x + src.power_y = power_y + src.dest_x = dest_x + src.dest_y = dest_y + +/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power) + + // returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle], + // rotated at [rotation] and with the power of [power] + // Thanks to VistaPOWA for this function + + var/power_x = power * cos(angle) + var/power_y = power * sin(angle) + var/time = 2* power_y / 10 //10 = g + + var/distance = time * power_x + + var/dest_x = src_x + distance*sin(rotation); + var/dest_y = src_y + distance*cos(rotation); + + return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e861826e0f..f2bd04a785 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1575,6 +1575,16 @@ datum/design/bag_holding reliability_base = 80 build_path = "/obj/item/weapon/storage/backpack/holding" +datum/design/bluespace_crystal + name = "Artificial Bluespace Crystal" + desc = "A small blue crystal with mystical properties." + id = "bluespace_crystal" + req_tech = list("bluespace" = 5, "materials" = 7) + build_type = PROTOLATHE + materials = list("$gold" = 1500, "$diamond" = 3000, "$plasma" = 1500) + reliability_base = 100 + build_path = "/obj/item/bluespace_crystal/artificial" + ///////////////////////////////////////// /////////////////HUDs//////////////////// ///////////////////////////////////////// diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm new file mode 100644 index 0000000000..d9e968f4da --- /dev/null +++ b/code/modules/telesci/bscrystal.dm @@ -0,0 +1,38 @@ +// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. + +/obj/item/bluespace_crystal + name = "bluespace crystal" + desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." + icon = 'icons/obj/telescience.dmi' + icon_state = "bluespace_crystal" + w_class = 1 + origin_tech = "bluespace=4;materials=3" + var/blink_range = 8 // The teleport range when crushed/thrown at someone. + +/obj/item/bluespace_crystal/New() + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + +/obj/item/bluespace_crystal/attack_self(var/mob/user) + blink_mob(user) + user.drop_item() + user.visible_message("[user] crushes the [src]!") + del(src) + +/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L) + do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') + +/obj/item/bluespace_crystal/throw_impact(atom/hit_atom) + ..() + if(isliving(hit_atom)) + blink_mob(hit_atom) + del(src) + +// Artifical bluespace crystal, doesn't give you much research. + +/obj/item/bluespace_crystal/artificial + name = "artificial bluespace crystal" + desc = "An artificially made bluespace crystal, it looks delicate." + origin_tech = "bluespace=2" + blink_range = 4 // Not as good as the organic stuff! \ No newline at end of file diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 79897c7e6e..3850d439d2 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -1,5 +1,6 @@ +var/list/GPS_list = list() /obj/item/device/gps - name = "Global Positioning System" + name = "global positioning system" desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/telescience.dmi' icon_state = "gps-c" @@ -11,9 +12,15 @@ var/emped = 0 /obj/item/device/gps/New() - name = "Global Positioning System ([gpstag])" + ..() + GPS_list.Add(src) + name = "global positioning system ([gpstag])" overlays += "working" +/obj/item/device/gps/Del() + GPS_list.Remove(src) + ..() + /obj/item/device/gps/emp_act(severity) emped = 1 overlays -= "working" @@ -24,6 +31,7 @@ overlays += "working" /obj/item/device/gps/attack_self(mob/user as mob) + var/obj/item/device/gps/t = "" if(emped) t += "ERROR" @@ -31,7 +39,7 @@ t += "
Set Tag " t += "
Tag: [gpstag]" - for(var/obj/item/device/gps/G in world) + for(var/obj/item/device/gps/G in GPS_list) var/turf/pos = get_turf(G) var/area/gps_area = get_area(G) var/tracked_gpstag = G.gpstag @@ -46,16 +54,14 @@ popup.open() /obj/item/device/gps/Topic(href, href_list) + ..() if(href_list["tag"] ) var/a = input("Please enter desired tag.", name, gpstag) as text - a = copytext(sanitize(a), 1, 20) - if(length(a) != 4) - usr << "\blue The tag must be four letters long!" - return - else + a = uppertext(copytext(sanitize(a), 1, 5)) + if(src.loc == usr) gpstag = a - name = "Global Positioning System ([gpstag])" - return + name = "global positioning system ([gpstag])" + attack_self(usr) /obj/item/device/gps/science icon_state = "gps-s" diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 1ebc1a3572..c54d079afd 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -8,10 +8,6 @@ use_power = 1 idle_power_usage = 200 active_power_usage = 5000 -/obj/machinery/telepad/New() - ..() -/obj/machinery/telepad/Del() - ..() //CARGO TELEPAD// /obj/machinery/telepad_cargo name = "cargo telepad" @@ -23,39 +19,35 @@ idle_power_usage = 20 active_power_usage = 500 var/stage = 0 -/obj/machinery/telepad_cargo/New() - ..() -/obj/machinery/telepad_cargo/Del() - ..() /obj/machinery/telepad_cargo/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) anchored = 0 playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(anchored) anchored = 0 - user << "\blue The [src] can now be moved." + user << " The [src] can now be moved." else if(!anchored) anchored = 1 - user << "\blue The [src] is now secured." + user << " The [src] is now secured." if(istype(W, /obj/item/weapon/screwdriver)) if(stage == 0) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unscrew the telepad's tracking beacon." + user << " You unscrew the telepad's tracking beacon." stage = 1 else if(stage == 1) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw in the telepad's tracking beacon." + user << " You screw in the telepad's tracking beacon." stage = 0 if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) playsound(src, 'sound/items/Welder.ogg', 50, 1) - user << "\blue You disassemble the telepad." + user << " You disassemble the telepad." new /obj/item/stack/sheet/metal(get_turf(src)) new /obj/item/stack/sheet/glass(get_turf(src)) del(src) ///TELEPAD CALLER/// /obj/item/device/telepad_beacon - name = "Telepad Beacon" + name = "telepad beacon" desc = "Use to warp in a cargo telepad." icon = 'icons/obj/radio.dmi' icon_state = "beacon" @@ -64,7 +56,7 @@ /obj/item/device/telepad_beacon/attack_self(mob/user as mob) if(user) - user << "\blue Locked In" + user << " Locked In" new /obj/machinery/telepad_cargo(user.loc) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) del(src) @@ -76,9 +68,6 @@ desc = "Use this to send crates and closets to cargo telepads." icon = 'icons/obj/telescience.dmi' icon_state = "rcs" - opacity = 0 - density = 0 - anchored = 0.0 flags = FPRINT | TABLEPASS| CONDUCT force = 10.0 throwforce = 10.0 @@ -94,18 +83,20 @@ var/teleporting = 0 /obj/item/weapon/rcs/New() + ..() processing_objects.Add(src) +/obj/item/weapon/rcs/examine() desc = "Use this to send crates and closets to cargo telepads. There are [rcharges] charges left." + ..() /obj/item/weapon/rcs/Del() processing_objects.Remove(src) - + ..() /obj/item/weapon/rcs/process() if(rcharges > 10) rcharges = 10 if(last_charge == 0) rcharges++ - desc = "Use this to send crates and closets to cargo telepads. There are [rcharges] charges left." last_charge = 30 else last_charge-- @@ -115,11 +106,11 @@ if(mode == 0) mode = 1 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << "\red The telepad locator has become uncalibrated." + user << " The telepad locator has become uncalibrated." else mode = 0 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << "\blue You calibrate the telepad locator." + user << " You calibrate the telepad locator." /obj/item/weapon/rcs/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/card/emag) && emagged == 0) @@ -127,5 +118,5 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - user << "\red You emag the RCS. Click on it to toggle between modes." + user << " You emag the RCS. Click on it to toggle between modes." return \ No newline at end of file diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 471473ed2e..85232a4106 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -1,20 +1,52 @@ /obj/machinery/computer/telescience - name = "Telepad Control Console" + name = "\improper Telepad Control Console" desc = "Used to teleport objects to and from the telescience telepad." icon_state = "teleport" + var/sending = 1 + var/obj/machinery/telepad/telepad = null + var/temp_msg = "Telescience control console initialized.
Welcome." // VARIABLES // var/teles_left // How many teleports left until it becomes uncalibrated - var/x_off // X offset - var/y_off // Y offset - var/x_co // X coordinate - var/y_co // Y coordinate - var/z_co // Z coordinate + var/datum/projectile_data/last_tele_data = null + var/z_co = 1 + var/power_off + var/rotation_off + var/angle_off + + var/rotation = 0 + var/angle = 45 + var/power + + // Based on the power used + var/teleport_cooldown = 0 + var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100) // every index requires a bluespace crystal + var/teleporting = 0 + var/starting_crystals = 3 + var/list/crystals = list() /obj/machinery/computer/telescience/New() - teles_left = rand(8,12) - x_off = rand(-10,10) - y_off = rand(-10,10) + ..() + link_telepad() + recalibrate() + +/obj/machinery/computer/telescience/Del() + eject() + ..() + +/obj/machinery/computer/telescience/examine() + ..() + usr << "There are [crystals.len] bluespace crystals in the crystal ports." + +/obj/machinery/computer/telescience/initialize() + ..() + link_telepad() + for(var/i = 1; i <= starting_crystals; i++) + crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals + power = power_options[1] + +/obj/machinery/computer/telescience/proc/link_telepad() + telepad = locate() in range(src, 7) /obj/machinery/computer/telescience/update_icon() if(stat & BROKEN) @@ -28,267 +60,250 @@ stat &= ~NOPOWER /obj/machinery/computer/telescience/attack_paw(mob/user) - usr << "You are too primitive to use this computer." + user << "You are too primitive to use this computer." return +/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/bluespace_crystal)) + if(crystals.len >= power_options.len) + user << "There are not enough crystal ports." + return + user.drop_item() + crystals += W + W.loc = null + user.visible_message("[user] inserts a [W] into the [src]'s crystal port.") + else + ..() + /obj/machinery/computer/telescience/attack_ai(mob/user) - src.attack_hand() + src.attack_hand(user) /obj/machinery/computer/telescience/attack_hand(mob/user) if(..()) return - if(stat & (NOPOWER|BROKEN)) - return - var/t = "" - t += "Set X" - t += "Set Y" - t += "Set Z" - t += "

Current set coordinates:" - t += "([x_co], [y_co], [z_co])" - t += "

Send" + interact(user) + +/obj/machinery/computer/telescience/interact(mob/user) + + var/t = "
[temp_msg]

" + t += "Set Bearing" + t += "
[rotation]°
" + t += "Set Elevation" + t += "
[angle]°
" + t += "Set Power" + t += "
" + + for(var/i = 1; i <= power_options.len; i++) + if(crystals.len < i) + t += "[power_options[i]]" + continue + if(power == power_options[i]) + t += "[power_options[i]]" + continue + t += "[power_options[i]]" + + t += "
" + t += "Set Sector" + t += "
[z_co ? z_co : "NULL"]
" + + t += "
Send" t += " Receive" - t += "

Recalibrate" - var/datum/browser/popup = new(user, "telesci", name, 640, 480) + t += "
Recalibrate Crystals Eject Crystals" + + // Information about the last teleport + t += "
" + if(!last_tele_data) + t += "No teleport data found." + else + t += "Source Location: ([last_tele_data.src_x], [last_tele_data.src_y])
" + //t += "Distance: [round(last_tele_data.distance, 0.1)]m
" + t += "Time: [round(last_tele_data.time, 0.1)] secs
" + t += "
" + + var/datum/browser/popup = new(user, "telesci", name, 300, 500) popup.set_content(t) popup.open() return + /obj/machinery/computer/telescience/proc/sparks() - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) + if(telepad) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) + s.set_up(5, 1, get_turf(telepad)) s.start() + else + return + /obj/machinery/computer/telescience/proc/telefail() - if(prob(95)) - sparks() - for(var/mob/O in hearers(src, null)) - O.show_message("\red The telepad weakly fizzles.", 2) + sparks() + visible_message("The telepad weakly fizzles.") + return + +/obj/machinery/computer/telescience/proc/doteleport(mob/user) + + if(teleport_cooldown > world.time) + temp_msg = "Telepad is recharging power.
Please wait [round((teleport_cooldown - world.time) / 10)] seconds." return - if(prob(5)) - // Irradiate everyone in telescience! - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - sparks() - for(var/mob/living/carbon/human/M in viewers(L, null)) - M.apply_effect((rand(10, 20)), IRRADIATE, 0) - M << "\red You feel strange." + + if(teleporting) + temp_msg = "Telepad is in use.
Please wait." return - if(prob(1)) - // AI CALL SHUTTLE I SAW RUNE, SUPER LOW CHANCE, CAN HARDLY HAPPEN - for(var/mob/living/carbon/O in viewers(src, null)) - var/datum/game_mode/cult/temp = new - O.show_message("\red The telepad flashes with a strange light, and you have a sudden surge of allegiance toward the true dark one!", 2) - O.mind.make_Cultist() - temp.grant_runeword(O) - sparks() - return - if(prob(1)) - // VIVA LA FUCKING REVOLUTION BITCHES, SUPER LOW CHANCE, CAN HARDLY HAPPEN - for(var/mob/living/carbon/O in viewers(src, null)) - O.show_message("\red The telepad flashes with a strange light, and you see all kind of images flash through your mind, of murderous things Nanotrasen has done, and you decide to rebel!", 2) - O.mind.make_Rev() - sparks() - return - if(prob(1)) - // The OH SHIT FUCK GOD DAMN IT LYNCH THE SCIENTISTS event. - for(var/mob/living/carbon/O in viewers(src, null)) - O.show_message("\red The telepad changes colors rapidly, and opens a portal, and you see what your mind seems to think is the very threads that hold the pattern of the universe together, and a eerie sense of paranoia creeps into you.", 2) - spacevine_infestation() - sparks() - return - if(prob(5)) - // HOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONK - for(var/mob/living/carbon/M in hearers(src, null)) - M << sound('sound/items/AirHorn.ogg') - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) - continue - M << "HONK" - M.sleeping = 0 - M.stuttering += 20 - M.ear_deaf += 30 - M.Weaken(3) - if(prob(30)) - M.Stun(10) - M.Paralyse(4) + + if(telepad) + + var/truePower = Clamp(power + power_off, 1, 1000) + var/trueRotation = rotation + rotation_off + var/trueAngle = Clamp(angle + angle_off, 1, 90) + + var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower) + last_tele_data = proj_data + + var/trueX = Clamp(round(proj_data.dest_x, 1), 1, world.maxx) + var/trueY = Clamp(round(proj_data.dest_y, 1), 1, world.maxy) + var/spawn_time = round(proj_data.time) * 10 + + var/turf/target = locate(trueX, trueY, z_co) + var/area/A = get_area(target) + flick("pad-beam", telepad) + + if(spawn_time > 15) // 1.5 seconds + playsound(telepad.loc, 'sound/weapons/flash.ogg', 25, 1) + // Wait depending on the time the projectile took to get there + teleporting = 1 + temp_msg = "Powering up bluespace crystals.
Please wait." + + + spawn(round(proj_data.time) * 10) // in seconds + if(!telepad) + return + if(telepad.stat & NOPOWER) + return + teleporting = 0 + teleport_cooldown = world.time + (power * 2) + teles_left -= 1 + + // use a lot of power + use_power(power * 10) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, get_turf(telepad)) + s.start() + + temp_msg = "Teleport successful.
" + if(teles_left < 10) + temp_msg += "
Calibration required soon." else - M.make_jittery(500) - sparks() - return - if(prob(1)) - // They did the mash! (They did the monster mash!) The monster mash! (It was a graveyard smash!) - sparks() - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/giant_spider/nurse) - var/list/hostiles = typesof(/mob/living/simple_animal/hostile) - blocked - playsound(L, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(L, null)) - flick("e_flash", M.flash) - var/chosen = pick(hostiles) - var/mob/living/simple_animal/hostile/H = new chosen - H.loc = L - return - return - return + temp_msg += "Data printed below." + investigate_log("[key_name(usr)]/[user] has teleported with Telescience at [trueX],[trueY],[z_co], in [A ? A.name : "null area"].","telesci") -/obj/machinery/computer/telescience/proc/dosend() - var/trueX = (x_co + x_off) - var/trueY = (y_co + y_off) - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/target = locate(trueX, trueY, z_co) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) - s.start() - flick("pad-beam", E) - usr << "\blue Teleport successful." - var/sparks = get_turf(target) - var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread - y.set_up(5, 1, sparks) - y.start() - for(var/obj/item/OI in L) - do_teleport(OI, target, 0) - for(var/obj/structure/closet/OC in L) - do_teleport(OC, target, 0) - for(var/mob/living/carbon/MO in L) - do_teleport(MO, target, 0) - for(var/mob/living/simple_animal/SA in L) - do_teleport(SA, target, 0) - return - return + var/sparks = get_turf(target) + var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread + y.set_up(5, 1, sparks) + y.start() -/obj/machinery/computer/telescience/proc/doreceive() - var/trueX = (x_co + x_off) - var/trueY = (y_co + y_off) - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/T = locate(trueX, trueY, z_co) - var/G = get_turf(T) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) - s.start() - flick("pad-beam", E) - usr << "\blue Teleport successful." - var/sparks = get_turf(T) - var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread - y.set_up(5, 1, sparks) - y.start() - for(var/obj/item/ROI in G) - do_teleport(ROI, E, 0) - for(var/obj/structure/closet/ROC in G) - do_teleport(ROC, E, 0) - for(var/mob/living/carbon/RMO in G) - do_teleport(RMO, E, 0) - for(var/mob/living/simple_animal/RSA in G) - do_teleport(RSA, E, 0) - return - return + var/turf/source = target + var/turf/dest = get_turf(telepad) + if(sending) + source = dest + dest = target -/obj/machinery/computer/telescience/proc/telesend() - if(x_co == "") - usr << "\red Error: set coordinates." + flick("pad-beam", telepad) + playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1) + for(var/atom/movable/ROI in source) + // if is anchored, don't let through + if(ROI.anchored) + if(isliving(ROI)) + var/mob/living/L = ROI + if(L.buckled) + // TP people on office chairs + if(L.buckled.anchored) + continue + else + continue + else if(!isobserver(ROI)) + continue + do_teleport(ROI, dest) + updateDialog() + +/obj/machinery/computer/telescience/proc/teleport(mob/user) + if(rotation == null || angle == null || z_co == null) + temp_msg = "ERROR!
Set a angle, rotation and sector." return - if(y_co == "") - usr << "\red Error: set coordinates." - return - if(z_co == "") - usr << "\red Error: set coordinates." - return - if(x_co < 1 || x_co > 255) + if(power <= 0) telefail() - usr << "\red Error: X is less than 11 or greater than 245." + temp_msg = "ERROR!
No power selected!" return - if(y_co < 1 || y_co > 255) + if(angle < 1 || angle > 90) telefail() - usr << "\red Error: Y is less than 11 or greater than 245." + temp_msg = "ERROR!
Elevation is less than 1 or greater than 90." return if(z_co == 2 || z_co < 1 || z_co > 6) telefail() - usr << "\red Error: Z is less than 1, greater than 6, or equal to 2." + temp_msg = "ERROR! Sector is less than 1,
greater than 6, or equal to 2." return if(teles_left > 0) - teles_left -= 1 - dosend() + doteleport(user) else - dosend() + telefail() + temp_msg = "ERROR!
Calibration required." return return -/obj/machinery/computer/telescience/proc/telereceive() - // basically the same thing - if(x_co == "") - usr << "\red Error: set coordinates." - return - if(y_co == "") - usr << "\red Error: set coordinates." - return - if(z_co == "") - usr << "\red Error: set coordinates." - return - if(x_co < 1 || x_co > 255) - telefail() - usr << "\red Error: X is less than 11 or greater than 200." - return - if(y_co < 1 || y_co > 255) - telefail() - usr << "\red Error: Y is less than 11 or greater than 200." - return - if(z_co == 2 || z_co < 1 || z_co > 6) - telefail() - usr << "\red Error: Z is less than 1, greater than 6, or equal to 2." - return - if(teles_left > 0) - teles_left -= 1 - doreceive() - else - if(prob(35)) - doreceive() - else - telefail() - return - return +/obj/machinery/computer/telescience/proc/eject() + for(var/obj/item/I in crystals) + I.loc = src.loc + crystals -= I + power = 0 /obj/machinery/computer/telescience/Topic(href, href_list) if(..()) return - if(href_list["setx"]) - var/a = input("Please input desired X coordinate.", name, x_co) as num - a = copytext(sanitize(a), 1, 20) - x_co = a - x_co = text2num(x_co) - return - if(href_list["sety"]) - var/b = input("Please input desired Y coordinate.", name, y_co) as num - b = copytext(sanitize(b), 1, 20) - y_co = b - y_co = text2num(y_co) - return + if(href_list["setrotation"]) + var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num + if(..()) // Check after we input a value, as they could've moved after they entered something + return + rotation = Clamp(new_rot, -900, 900) + rotation = round(rotation, 0.01) + + if(href_list["setangle"]) + var/new_angle = input("Please input desired elevation in degrees.", name, angle) as num + if(..()) + return + angle = Clamp(round(new_angle, 0.1), 1, 9999) + + if(href_list["setpower"]) + var/index = href_list["setpower"] + index = text2num(index) + if(index != null && power_options[index]) + if(crystals.len >= index) + power = power_options[index] + if(href_list["setz"]) - var/c = input("Please input desired Z coordinate.", name, z_co) as num - c = copytext(sanitize(c), 1, 20) - z_co = c - z_co = text2num(z_co) - return + var/new_z = input("Please input desired sector.", name, z_co) as num + if(..()) + return + z_co = Clamp(round(new_z), 1, 10) + if(href_list["send"]) - telesend() - return + sending = 1 + teleport(usr) + if(href_list["receive"]) - telereceive() - return + sending = 0 + teleport(usr) + if(href_list["recal"]) - teles_left = rand(9,12) - x_off = rand(-10,10) - y_off = rand(-10,10) - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) - s.start() - usr << "\blue Calibration successful." - return \ No newline at end of file + recalibrate() + sparks() + temp_msg = "NOTICE:
Calibration successful." + + if(href_list["eject"]) + eject() + temp_msg = "NOTICE:
Bluespace crystals ejected." + + updateDialog() + +/obj/machinery/computer/telescience/proc/recalibrate() + teles_left = rand(30, 40) + angle_off = rand(-25, 25) + power_off = rand(-4, 0) + rotation_off = rand(-10, 10) \ No newline at end of file diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi index 1f3344f2e489b37a9af7af606c3fbc67b99937b7..4e8251beac3fdf48bf7e083c7ec4e82cea642f1c 100644 GIT binary patch delta 1817 zcmV+!2j=*o5c?327Y@J(0{{R3WdfWv0003su_Y$~C&0kKK5zeKng5y0|5K^|0A~M~ zp4vhH0004WQchCn$AirQryFx>G zq(upTZ;K{Cgpj%HPG%-MO{1a-{&dCjbBj8A(JzRCt{2nu%81Mihp%v~^ok#A1oiCatoOvV-d-A*oYp z473dtT3R<72xu2w5lhvm_(^v)o@ZqXSnM#`R)eb9*<9X(A3x z{wWYkFCzvD4j!;9tpn4<9AG09l)6$(S0a-E6EScDqhs-pIs%h#ngWVRbYl~16a)Hu zjIIJR@pa8uhG}WmF%M5S1g4lqxdb-?R{Ad{Y?ok0Q%Dh^e;M25W%9Mg z}kw*J*fW&)KOfqxC{=~h&KE|LTq6RAj_O6s>=?+)k|sCPW~wyOR#lPv@te|}e` z-*cS%pgn;7z5{29`VW!zvHoQ`6mZ$*EqP0ie0KE26^VWq(I4pa@0T7uMCxPx%XC%( zPI(Df<$(@Yr1}h^&m#I9qGSC_bzXvBgxThZpA`BuqTfSw3(>Lu<+>4EV>rQ=>!uo* zY~5hjJa2iKi_6QN$G%IYi$co`e<8+7Ou8O-vMjw`7MS4;XfzoOwE?cH#I1UZ>#gDpG~0}((m=EQnCS|2t1jy6e+=kzs}`1@ z*XpAfXg_H`&R}5V{QU3>4*vR5Uw^a_c#>%Zg8aMUJ?aSg`HG{_!9al8KvTB}z(9c9 z0FT=Ck^DU9>i2v|eOSZ|cnUQ%i&zUR;ubuGTEmNYkbn29z9v7vgXmD-Vfs!=9~i)% zLYM*RQz*>8KlPq@3;qHef88Bre%_bn?;VNm4D$Dpf##1L_^784WGGPN@Inc(vzT-*No(AK+ks_20>0AgDiNK;+;3h;)7)W=_?Q z!_MP+kh+gG03UbQfS5v!j8mvJWFT999?#zk0}Zi=$2HIri#Tl{f1ZE$k^KBvdgLJE zFQZ!_LrRo?hnb$v=OeH~Hu9^QQFa z@6sC}2!bHW49lr#l8cki?$5h?FDtttMF%n_yWMW5)9H4*B{cx?XEvbC&*!c0cK5ix zr#67L-|n<~%Iq-ce?5>p8odJzAbL-!?{-D@S!qD%%J%U9S^qkNnBHS#GSJf-X!r0D zPzJ#6a1R-QUgi-{-v9&4&*!a!fdI7ur2T?{MZ5=3p*_tao@_>V3QaaJg@XKli46q# z|MD6r`xM#}i+Hc321@_SC_xYeK@bE%5ClOKNTKfsu0u!ifA59sy&m#@0Lj1SuJ?MG z>IeDvOabce5OxQ%j!?nx2eRt~K@bE%5ClOG1VIo4K@chS_xBGD4i1r0h3EH``r$9X zG7b)ZJLH?9K9*g^)8|-rTl?SVn(Xt7qvPLCPX9PQKK}FU_^-2Lxr4&r4={gngD;N$ z7Mz{2?MT(Yf26*l>G%IhpfE7O`TwJrj90Jv{nxMi{l2n|$>#9o8{_Ty`P-u77@wmz z#>KmL7e$9LJ}?3o=jSCh0F-+KfD54L7zlzO2!bF8f*=TjAkw^lUvvc7IQ{T%sU4ht zIJqpfgVU3f%S$p)Af=x|#(yPW#NeRh@e>3=5ClPd7gYQYcJIJT;N>|200000NkvXX Hu0mjfa`k|> delta 1762 zcmV<81|9kP5TFo{7Y?8Z0{{R3ZT6FI0003au_Y$~f4$V|2mk;80d!JMQvg8b*k%9# z0Ks}xSad{Xb7OL8aCB*JZU6vyoP|-#3WG2ZJSSff^s1$`_Sj2Niii3S(QGyNNJv7Z zf8WFwRI12ac88f^C-KQGy=OT|9vOat(p>c9O5(#2qk%J1+vOZ#R0FSS^If!|2JGlb z%EAI@f9GMuxYCw7Vf0kA12b%!5uc=aGJf#~jDv%}*g?&T000Hv zNklB)YYUHH!iLJw{i7nfO{TmSI|&baZEJYK{SkOUFT{>X+*UIeyE5HWv}I7fAR%J_tAS8RC^e@p0}3q9?C-*wZrzp!oT5SXI=m!iHrK6U@I z>4s6MR^);RxUy17oW}!Xfq!LH44HxOxl>uKMCEVPzvxq|Gi*mU0HCkgsVh-De6!bW z={gP1>zVtW&GYn^?u)3hGcW?v2K zCv~iUt!~%cDwAEW=50A!aCBLbs#~)|eKpe8B7G&M-+|+%dl&TeukY6Gx|^WfiRo5U zei1mlKIj&x_dWNXs{SgIPXrx* z{y?Qabeu<^J%;^}180i*PmuPp{$)B8aM|WSO)O zbXEdRc?nqMfeu%s`Wm9IBl-rSWBp5YUV>kQ+2)9!6#6QnKSXp3(XsyJx)EGsIKh|e zrW#mo-C)-|uU_Y3z3zGJyHvU;RA&f(F;-&P^|+I|^mZeB_%)h^k z<=;=@`FWq~uO|8V7c4*TPjn~Le{#IqE3Th7e)c?T{aXm=g#~Of-J8eKrp;pEzbUbAsTYetT-wOjRv54n2a4Z&a+CV&i|L!CC`MLDS zLB?N3k3y!DDE|&KLz|yRbw{e_&LsctBl-FH^!yFvoWIXMe&d$%_j!|l{yuN=&)?@w z>C@k(H$V^sL6jMmQ_&TWe!rv!ApXn-wE6kG^jKBpuPbHmY>gC2Ll0W14#P?1B-Y7PoaTk5id70JcX7Um_kARzr+TD z{C{~3lzj>f#3CM))IjNf86^mUAP9mW2!bGp0x9(Uz#?=c|6aI%J{%(N2ax=G?)q?; zseX`u&lI5k4qj)M6ejvL}5ClOG1VIo4K@bE%5CoCp^z`)X?CcyVRd{}1sh|Jy zE930^w{yNJ>SNhuJbjL3x3&L$uE{>Xz8L-f$De-oFy6i$kKer;kH^Y3mYef8?~M;vS09RwV}35) z8`mE{UKbt4{J;oYUtN{h08s7`0Iq?eV;~5EAP6Ghe`3$G9$@}B!2kdN07*qoM6N<$ Ef*1y3Gynhq From 06719b5aa9b25a4566206d0d79ee1861094edbf1 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 19 Nov 2013 23:00:07 -0800 Subject: [PATCH 19/36] added a fuck ton of small changes --- .../items/weapons/implants/implantfreedom.dm | 2 +- code/modules/clothing/spacesuits/rig.dm | 6 +- code/modules/research/designs.dm | 208 +++++++++++++++++- 3 files changed, 209 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index 0d31eb2e5c..58d73d835a 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -1,7 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 /obj/item/weapon/implant/freedom - name = "freedom" + name = "freedom implant" desc = "Use this to escape from those evil Red Shirts." item_color = "r" var/activation_emote = "chuckle" diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 027a2e3a57..ec789c4892 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -12,7 +12,8 @@ icon_action_button = "action_hardhat" heat_protection = HEAD max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") + // species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") Commented out to solve the issue of "OH FUCK I ROLLED NUKE OP ALIEN AND THERE AREN'T ANY ADMINS ABLE TO FIX IT ON", as it made nuke rounds a pain in the ass when one of your squaddies was unable to join in. + // TODO: Make nuke ops hardsuit sprites for Unathi, Tajaran, Skrell, Diona, and Vox so this can be uncommented and shit can work again. attack_self(mob/user) if(!isturf(user.loc)) @@ -47,7 +48,8 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE - species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + //species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") See comment on respective helmet. + // TODO: Make nuke ops hardsuit helmet sprites for Unathi, Tajaran, Skrell, Diona, and Vox so this can be uncommented. //Chief Engineer's rig /obj/item/clothing/head/helmet/space/rig/elite diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e861826e0f..ab8b95e111 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1341,6 +1341,43 @@ datum/design/nanopaste materials = list("$metal" = 7000, "$glass" = 7000) build_path = "/obj/item/stack/nanopaste" +datum/design/implant_loyal + name = "loyalty implant" + desc = "Makes you loyal or such." + id = "implant_loyal" + req_tech = list("materials" = 2, "biotech" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 7000, "$glass" = 7000) + build_path = "/obj/item/weapon/implant/loyalty" + +datum/design/implant_chem + name = "chemical implant" + desc = "Injects things." + id = "implant_chem" + req_tech = list("materials" = 2, "biotech" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/implant/chem" + +datum/design/implant_free + name = "freedom implant" + desc = "Use this to escape from those evil Red Shirts." + id = "implant_free" + req_tech = list("syndicate" = 2, "biotech" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/implant/freedom" + +datum/design/chameleon + name = "Chameleon Jumpsuit" + desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." + id = "chameleon" + req_tech = list("syndicate" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 500) + build_path = "/obj/item/clothing/under/chameleon" + + datum/design/bluespacebeaker name = "bluespace beaker" desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." @@ -1350,7 +1387,6 @@ datum/design/bluespacebeaker materials = list("$metal" = 3000, "$plasma" = 3000, "$diamond" = 500) reliability_base = 76 build_path = "/obj/item/weapon/reagent_containers/glass/beaker/bluespace" - category = "Misc" datum/design/noreactbeaker name = "cryostasis beaker" @@ -1406,17 +1442,17 @@ datum/design/decloner materials = list("$gold" = 5000,"$uranium" = 10000, "mutagen" = 40) build_path = "/obj/item/weapon/gun/energy/decloner" locked = 1 -/* + datum/design/chemsprayer name = "Chem Sprayer" desc = "An advanced chem spraying device." id = "chemsprayer" - req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) + req_tech = list("materials" = 3, "engineering" = 3, "biotech" = 2) build_type = PROTOLATHE materials = list("$metal" = 5000, "$glass" = 1000) reliability_base = 100 build_path = "/obj/item/weapon/chemsprayer" -*/ + datum/design/rapidsyringe name = "Rapid Syringe Gun" desc = "A gun that fires many syringes." @@ -1642,3 +1678,167 @@ datum/design/borg_syndicate_module req_tech = list("combat" = 4, "syndicate" = 3) build_path = "/obj/item/borg/upgrade/syndicate" category = "Cyborg Upgrade Modules" + +///////////////////////////////////////// +/////////////PDA and Radio stuff///////// +///////////////////////////////////////// +datum/design/binaryencrypt + name = "Binary Encrpytion Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + id = "binaryencrypt" + req_tech = list("syndicate" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 300, "$glass" = 300) + build_path = "/obj/item/device/encryptionkey/binary" +datum/design/pda + name = "PDA" + desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge." + id = "pda" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/device/pda" +datum/design/cart_basic + name = "Generic Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_basic" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge" +datum/design/cart_engineering + name = "Power-ON Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_engineering" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/engineering" +datum/design/cart_atmos + name = "BreatheDeep Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_atmos" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/atmos" +datum/design/cart_medical + name = "Med-U Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_medical" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/medical" +datum/design/cart_chemistry + name = "ChemWhiz Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_chemistry" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/chemistry" +datum/design/cart_security + name = "R.O.B.U.S.T. Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_security" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/security" +datum/design/cart_janitor + name = "CustodiPRO Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_janitor" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/janitor" +datum/design/cart_clown + name = "Honkworks 5.0 Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_clown" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/clown" +datum/design/cart_mime + name = "Gestur-O 1000 Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_mime" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/mime" +datum/design/cart_toxins + name = "Signal Ace 2 Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_toxins" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/toxins" +datum/design/cart_quartermaster + name = "Space Parts & Space Vendors Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_quartermaster" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/quartermaster" +datum/design/cart_hop + name = "Human Resources 9001 Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_hop" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/hop" +datum/design/cart_hos + name = "R.O.B.U.S.T. DELUXE Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_hos" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/hos" +datum/design/cart_ce + name = "Power-On DELUXE Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_ce" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/ce" +datum/design/cart_cmo + name = "Med-U DELUXE Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_cmo" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/cmo" +datum/design/cart_rd + name = "Signal Ace DELUXE Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_rd" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/rd" +datum/design/cart_captain + name = "Value-PAK Cartridge" + desc = "A data cartridge for portable microcomputers." + id = "cart_captain" + req_tech = list("engineering" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/captain" +datum/design/cart_traitor + name = "Detomatix Cart" + desc = "A data cartridge for portable microcomputers." + id = "cart_traitor" + req_tech = list("syndicate" = 2, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = "/obj/item/weapon/cartridge/syndicate" \ No newline at end of file From 2be70afe8b3c9b9fac1f5de5d023a11cd1fe4a49 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 19 Nov 2013 23:12:41 -0800 Subject: [PATCH 20/36] changed it so that only syndi-hardsuits only restrict vox --- code/modules/clothing/spacesuits/rig.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index ec789c4892..05411337bc 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -12,9 +12,7 @@ icon_action_button = "action_hardhat" heat_protection = HEAD max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE - // species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") Commented out to solve the issue of "OH FUCK I ROLLED NUKE OP ALIEN AND THERE AREN'T ANY ADMINS ABLE TO FIX IT ON", as it made nuke rounds a pain in the ass when one of your squaddies was unable to join in. - // TODO: Make nuke ops hardsuit sprites for Unathi, Tajaran, Skrell, Diona, and Vox so this can be uncommented and shit can work again. - + species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") attack_self(mob/user) if(!isturf(user.loc)) user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities. @@ -48,8 +46,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE - //species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") See comment on respective helmet. - // TODO: Make nuke ops hardsuit helmet sprites for Unathi, Tajaran, Skrell, Diona, and Vox so this can be uncommented. + species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") //Chief Engineer's rig /obj/item/clothing/head/helmet/space/rig/elite @@ -92,7 +89,7 @@ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.6 var/obj/machinery/camera/camera - + species_restricted = list("exclude","Vox") /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) if(camera) ..(user) @@ -118,6 +115,7 @@ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) siemens_coefficient = 0.6 + species_restricted = list("exclude","Vox") //Wizard Rig From 9015b815b3e2455338aa46ce690aaabc09736d91 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:18:38 +1030 Subject: [PATCH 21/36] Uncommented the original Heist objective code, removed one-of-each testing code. --- code/game/gamemodes/heist/heist.dm | 38 +++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index e98d128559..a3f44a5202 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -139,10 +139,8 @@ var/global/vox_kills = 0 //Used to check the Inviolate. /datum/game_mode/heist/proc/forge_vox_objectives() - - //Commented out for testing. - /* var/i = 1 - var/max_objectives = pick(2,2,2,3,3) + var/i = 1 + var/max_objectives = pick(2,2,2,2,3,3,3,4) var/list/objs = list() while(i<= max_objectives) var/list/goals = list("kidnap","loot","salvage") @@ -163,13 +161,7 @@ var/global/vox_kills = 0 //Used to check the Inviolate. //-All- vox raids have these two objectives. Failing them loses the game. objs += new /datum/objective/heist/inviolate_crew - objs += new /datum/objective/heist/inviolate_death */ - - raid_objectives += new /datum/objective/heist/kidnap - raid_objectives += new /datum/objective/heist/loot - raid_objectives += new /datum/objective/heist/salvage - raid_objectives += new /datum/objective/heist/inviolate_crew - raid_objectives += new /datum/objective/heist/inviolate_death + objs += new /datum/objective/heist/inviolate_death for(var/datum/objective/heist/O in raid_objectives) O.choose_target() @@ -181,6 +173,7 @@ var/global/vox_kills = 0 //Used to check the Inviolate. raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to Tau Ceti and much of the unexplored galaxy. You and the crew have come to the Exodus for plunder, trade or both." raider.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious." raider.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!" + raider.current << "\red IF YOU HAVE NOT PLAYED A VOX BEFORE, REVIEW THIS THREAD: http://baystation12.net/forums/viewtopic.php?f=6&t=8657." var/obj_count = 1 for(var/datum/objective/objective in raider.objectives) raider.current << "Objective #[obj_count]: [objective.explanation_text]" @@ -252,6 +245,29 @@ var/global/vox_kills = 0 //Used to check the Inviolate. feedback_add_details("traitor_objective","[objective.type]|FAIL") count++ + var/text = "The vox raiders were:" + + for(var/datum/mind/vox in raiders) + text += "
[vox.key] was [vox.name] (" + if(check_return) + var/obj/stack = raiders[vox] + if(get_area(stack) != locate(/area/shuttle/vox/station)) + text += "left behind)" + continue + if(vox.current) + if(vox.current.stat == DEAD) + text += "died" + else + text += "survived" + if(vox.current.real_name != vox.name) + text += " as [vox.current.real_name]" + else + text += "body destroyed" + text += ")" + + world << text + return 1 + ..() datum/game_mode/proc/auto_declare_completion_heist() From 542104478f1cdf59b9453a2e1b974a16ed2cd01a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:18:55 +1030 Subject: [PATCH 22/36] Commented out the Sec-healing component of sprinkles. --- code/modules/reagents/Chemistry-Reagents.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index bf29dc863f..e24a0cd03e 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -2177,12 +2177,13 @@ datum on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) + /*if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) if(!M) M = holder.my_atom M.heal_organ_damage(1,1) M.nutrition += nutriment_factor ..() return + */ ..() /* //removed because of meta bullshit. this is why we can't have nice things. From 32b2009c25743e8ce590549a7eea506b667fe6e8 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:26:55 +1030 Subject: [PATCH 23/36] Diona will take five times as much damage from plant-B-gone as previously. --- code/modules/reagents/Chemistry-Reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index e24a0cd03e..e512da7d59 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1681,7 +1681,7 @@ datum var/mob/living/carbon/human/H = M if(H.dna) if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage - H.adjustToxLoss(10) + H.adjustToxLoss(50) toxin/stoxin name = "Sleep Toxin" From 249cd0d0699eb1423a5e8614522f5bd366337ec9 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:32:00 +1030 Subject: [PATCH 24/36] Increased REQUIRE_LIGHT min level to 5, removed burn damage from healing from RAD_ABSORB. --- code/modules/mob/living/carbon/human/life.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d9354dccd6..957ed014d4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -242,7 +242,7 @@ var/rads = radiation/25 radiation -= rads nutrition += rads - heal_overall_damage(rads,rads) + adjustBruteLoss(-(rads)) adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) updatehealth() @@ -887,8 +887,8 @@ if(nutrition > 500) nutrition = 500 - if(light_amount > 2) //if there's enough light, heal - heal_overall_damage(1,1) + if(light_amount > 5) //if there's enough light, heal + adjustBruteLoss(-1) adjustToxLoss(-1) adjustOxyLoss(-1) if(dna && dna.mutantrace == "shadow") From 71416e543e09d46845cdc5f0f76be7b0dd4ecf6b Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:33:39 +1030 Subject: [PATCH 25/36] Changed diona evolution to use nutrition rather than nutriment. --- code/modules/mob/living/carbon/monkey/diona.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/monkey/diona.dm index 1d80763fdc..442d33e2ac 100644 --- a/code/modules/mob/living/carbon/monkey/diona.dm +++ b/code/modules/mob/living/carbon/monkey/diona.dm @@ -68,7 +68,7 @@ src << "You are not yet ready for your growth..." return - if(reagents.get_reagent_amount("nutriment") < 5) + if(nutrition < 400) src << "You have not yet consumed enough to grow..." return From 222a544d5dcc96e29ab22e4e7742dd1dbf3552c3 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:47:37 +1030 Subject: [PATCH 26/36] Raider state display compile fix. --- code/game/gamemodes/heist/heist.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index a3f44a5202..4dfff4fc4c 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -245,16 +245,15 @@ var/global/vox_kills = 0 //Used to check the Inviolate. feedback_add_details("traitor_objective","[objective.type]|FAIL") count++ - var/text = "The vox raiders were:" + var/text = "The vox raiders were:" for(var/datum/mind/vox in raiders) text += "
[vox.key] was [vox.name] (" - if(check_return) - var/obj/stack = raiders[vox] - if(get_area(stack) != locate(/area/shuttle/vox/station)) - text += "left behind)" - continue - if(vox.current) + var/obj/stack = raiders[vox] + if(get_area(stack) != locate(/area/shuttle/vox/station)) + text += "left behind)" + continue + else if(vox.current) if(vox.current.stat == DEAD) text += "died" else From ab43cc9cd6179a50395854c59eccfb43a651641b Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Wed, 20 Nov 2013 14:56:49 -0800 Subject: [PATCH 27/36] made head PDA carts be in lockboxes. Added Abandoned Crates! --- code/modules/mining/abandonedcrates.dm | 147 +++++++++++++++++++++++++ code/modules/mining/mine_turfs.dm | 6 +- code/modules/research/designs.dm | 10 +- 3 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 code/modules/mining/abandonedcrates.dm diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm new file mode 100644 index 0000000000..72ddbffe4a --- /dev/null +++ b/code/modules/mining/abandonedcrates.dm @@ -0,0 +1,147 @@ +/obj/structure/closet/crate/secure/loot + name = "abandoned crate" + desc = "What could be inside?" + icon_state = "securecrate" + icon_opened = "securecrateopen" + icon_closed = "securecrate" + var/code = null + var/lastattempt = null + var/attempts = 3 + locked = 1 + var/min = 1 + var/max = 10 + +/obj/structure/closet/crate/secure/loot/New() + ..() + code = rand(min,max) + var/loot = rand(1,30) + switch(loot) + if(1) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/rum(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src) + new/obj/item/weapon/lighter/zippo(src) + if(2) + new/obj/item/weapon/pickaxe/drill(src) + new/obj/item/device/taperecorder(src) + new/obj/item/clothing/suit/space/rig(src) + new/obj/item/clothing/head/helmet/space/rig(src) + if(3) + for(var/i = 0, i < 12, i++) + new/obj/item/weapon/coin/diamond(src) + if(4) + new/obj/item/clothing/shoes/clown_shoes(src) + new/obj/item/clothing/under/rank/clown(src) + new/obj/item/clothing/mask/gas/clown_hat(src) + new/obj/item/weapon/bananapeel(src) + if(5) + for(var/i = 0, i < 6, i++) + new/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake(src) + new/obj/item/weapon/lighter/zippo(src) + if(7) + new/obj/item/weapon/reagent_containers/glass/beaker/bluespace(src) + if(9) + for(var/i = 0, i < 5, i++) + new/obj/item/weapon/ore/diamond(src) + if(10) + for(var/i = 0, i < 5, i++) + new/obj/item/weapon/ore/clown(src) + if(11) + return + if(12) + new/obj/item/seeds/deathberryseed(src) + new/obj/item/seeds/deathnettleseed(src) + if(13) + new/obj/machinery/hydroponics(src) + if(14) + new/obj/item/seeds/cashseed(src) + if(15) + for(var/i = 0, i < 3, i++) + new/obj/item/weapon/reagent_containers/glass/beaker/noreact(src) + new/obj/item/weapon/reagent_containers/hypospray(src) + if(16) + for(var/i = 0, i < 9, i++) + new/obj/item/bluespace_crystal(src) + if(17) + new/obj/item/mecha_parts/mecha_equipment/weapon/honker(src) + new/obj/item/mecha_parts/chassis/honker(src) + new/obj/item/mecha_parts/part/honker_torso(src) + new/obj/item/mecha_parts/part/honker_head(src) + new/obj/item/mecha_parts/part/honker_left_arm(src) + if(18) + return + if(19) + for(var/i = 0, i < 4, i++) + new/obj/item/weapon/melee/classic_baton(src) + if(20) + new/obj/item/weapon/storage/lockbox/clusterbang(src) + if(21) + new/obj/item/weapon/aiModule/robocop(src) + if(22) + new/obj/item/clothing/under/chameleon(src) + for(var/i = 0, i < 7, i++) + new/obj/item/clothing/tie/horrible(src) + if(23) + new/obj/item/clothing/under/shorts(src) + new/obj/item/clothing/under/shorts/red(src) + new/obj/item/clothing/under/shorts/blue(src) + //Dummy crates start here. + if(24 to 29) + return + if(8) + return + if(6) + return + //Dummy crates end here. + if(30) + for(var/i = 0, i < 4, i++) + new/obj/item/weapon/melee/baton(src) + +/obj/structure/closet/crate/secure/loot/attack_hand(mob/user as mob) + if(locked) + user << "The crate is locked with a Deca-code lock." + var/input = input(usr, "Enter digit from [min] to [max].", "Deca-Code Lock", "") as num + if(in_range(src, user)) + input = Clamp(input, 0, 10) + if (input == code) + user << "The crate unlocks!" + locked = 0 + else if (input == null || input > max || input < min) + user << "You leave the crate alone." + else + user << "A red light flashes." + lastattempt = input + attempts-- + if (attempts == 0) + user << "The crate's anti-tamper system activates!" + var/turf/T = get_turf(src.loc) + explosion(T, 0, 1, 2, 1) + del(src) + return + else + user << "You attempt to interact with the device using a hand gesture, but it appears this crate is from before the DECANECT came out." + return + else + return ..() + +/obj/structure/closet/crate/secure/loot/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(locked) + if (istype(W, /obj/item/weapon/card/emag)) + user << "The crate unlocks!" + locked = 0 + if (istype(W, /obj/item/device/multitool)) + user << "DECA-CODE LOCK REPORT:" + if (attempts == 1) + user << "* Anti-Tamper Bomb will activate on next failed access attempt." + else + user << "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts." + if (lastattempt == null) + user << " has been made to open the crate thus far." + return + // hot and cold + if (code > lastattempt) + user << "* Last access attempt lower than expected code." + else + user << "* Last access attempt higher than expected code." + else ..() + else ..() diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 83077154a8..c410a51c00 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -486,7 +486,11 @@ commented out in r5061, I left it because of the shroom thingies var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) N.fullUpdateMineralOverlays() - + var/crate = rand(1,30) + switch(crate) + if(1) + visible_message("After digging, you find an old dusty crate buried within!") + new/obj/structure/closet/crate/secure/loot(src) return /turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ab8b95e111..7b1c2bd22b 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1746,6 +1746,7 @@ datum/design/cart_security build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/security" + locked = 1 datum/design/cart_janitor name = "CustodiPRO Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1786,6 +1787,7 @@ datum/design/cart_quartermaster build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/quartermaster" + locked = 1 datum/design/cart_hop name = "Human Resources 9001 Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1794,6 +1796,7 @@ datum/design/cart_hop build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/hop" + locked = 1 datum/design/cart_hos name = "R.O.B.U.S.T. DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1802,6 +1805,7 @@ datum/design/cart_hos build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/hos" + locked = 1 datum/design/cart_ce name = "Power-On DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1810,6 +1814,7 @@ datum/design/cart_ce build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/ce" + locked = 1 datum/design/cart_cmo name = "Med-U DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1818,6 +1823,7 @@ datum/design/cart_cmo build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/cmo" + locked = 1 datum/design/cart_rd name = "Signal Ace DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1826,6 +1832,7 @@ datum/design/cart_rd build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/rd" + locked = 1 datum/design/cart_captain name = "Value-PAK Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1834,6 +1841,7 @@ datum/design/cart_captain build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/captain" + locked = 1 datum/design/cart_traitor name = "Detomatix Cart" desc = "A data cartridge for portable microcomputers." @@ -1841,4 +1849,4 @@ datum/design/cart_traitor req_tech = list("syndicate" = 2, "powerstorage" = 3) build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) - build_path = "/obj/item/weapon/cartridge/syndicate" \ No newline at end of file + build_path = "/obj/item/weapon/cartridge/syndicate" From 7fa80e799a9884477d99e1ba330cfbfa20a00c2a Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Wed, 20 Nov 2013 14:56:49 -0800 Subject: [PATCH 28/36] made head PDA carts be in lockboxes. Added Abandoned Crates! --- baystation12.dme | 1 + code/modules/mining/abandonedcrates.dm | 147 +++++++++++++++++++++++++ code/modules/mining/mine_turfs.dm | 6 +- code/modules/research/designs.dm | 10 +- 4 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 code/modules/mining/abandonedcrates.dm diff --git a/baystation12.dme b/baystation12.dme index 35a7237aa1..2aadb62ced 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -819,6 +819,7 @@ #include "code\modules\maps\reader.dm" #include "code\modules\maps\swapmaps.dm" #include "code\modules\maps\writer.dm" +#include "code\modules\mining\abandonedcrates.dm" #include "code\modules\mining\machine_input_output_plates.dm" #include "code\modules\mining\machine_processing.dm" #include "code\modules\mining\machine_stacking.dm" diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm new file mode 100644 index 0000000000..72ddbffe4a --- /dev/null +++ b/code/modules/mining/abandonedcrates.dm @@ -0,0 +1,147 @@ +/obj/structure/closet/crate/secure/loot + name = "abandoned crate" + desc = "What could be inside?" + icon_state = "securecrate" + icon_opened = "securecrateopen" + icon_closed = "securecrate" + var/code = null + var/lastattempt = null + var/attempts = 3 + locked = 1 + var/min = 1 + var/max = 10 + +/obj/structure/closet/crate/secure/loot/New() + ..() + code = rand(min,max) + var/loot = rand(1,30) + switch(loot) + if(1) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/rum(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src) + new/obj/item/weapon/lighter/zippo(src) + if(2) + new/obj/item/weapon/pickaxe/drill(src) + new/obj/item/device/taperecorder(src) + new/obj/item/clothing/suit/space/rig(src) + new/obj/item/clothing/head/helmet/space/rig(src) + if(3) + for(var/i = 0, i < 12, i++) + new/obj/item/weapon/coin/diamond(src) + if(4) + new/obj/item/clothing/shoes/clown_shoes(src) + new/obj/item/clothing/under/rank/clown(src) + new/obj/item/clothing/mask/gas/clown_hat(src) + new/obj/item/weapon/bananapeel(src) + if(5) + for(var/i = 0, i < 6, i++) + new/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake(src) + new/obj/item/weapon/lighter/zippo(src) + if(7) + new/obj/item/weapon/reagent_containers/glass/beaker/bluespace(src) + if(9) + for(var/i = 0, i < 5, i++) + new/obj/item/weapon/ore/diamond(src) + if(10) + for(var/i = 0, i < 5, i++) + new/obj/item/weapon/ore/clown(src) + if(11) + return + if(12) + new/obj/item/seeds/deathberryseed(src) + new/obj/item/seeds/deathnettleseed(src) + if(13) + new/obj/machinery/hydroponics(src) + if(14) + new/obj/item/seeds/cashseed(src) + if(15) + for(var/i = 0, i < 3, i++) + new/obj/item/weapon/reagent_containers/glass/beaker/noreact(src) + new/obj/item/weapon/reagent_containers/hypospray(src) + if(16) + for(var/i = 0, i < 9, i++) + new/obj/item/bluespace_crystal(src) + if(17) + new/obj/item/mecha_parts/mecha_equipment/weapon/honker(src) + new/obj/item/mecha_parts/chassis/honker(src) + new/obj/item/mecha_parts/part/honker_torso(src) + new/obj/item/mecha_parts/part/honker_head(src) + new/obj/item/mecha_parts/part/honker_left_arm(src) + if(18) + return + if(19) + for(var/i = 0, i < 4, i++) + new/obj/item/weapon/melee/classic_baton(src) + if(20) + new/obj/item/weapon/storage/lockbox/clusterbang(src) + if(21) + new/obj/item/weapon/aiModule/robocop(src) + if(22) + new/obj/item/clothing/under/chameleon(src) + for(var/i = 0, i < 7, i++) + new/obj/item/clothing/tie/horrible(src) + if(23) + new/obj/item/clothing/under/shorts(src) + new/obj/item/clothing/under/shorts/red(src) + new/obj/item/clothing/under/shorts/blue(src) + //Dummy crates start here. + if(24 to 29) + return + if(8) + return + if(6) + return + //Dummy crates end here. + if(30) + for(var/i = 0, i < 4, i++) + new/obj/item/weapon/melee/baton(src) + +/obj/structure/closet/crate/secure/loot/attack_hand(mob/user as mob) + if(locked) + user << "The crate is locked with a Deca-code lock." + var/input = input(usr, "Enter digit from [min] to [max].", "Deca-Code Lock", "") as num + if(in_range(src, user)) + input = Clamp(input, 0, 10) + if (input == code) + user << "The crate unlocks!" + locked = 0 + else if (input == null || input > max || input < min) + user << "You leave the crate alone." + else + user << "A red light flashes." + lastattempt = input + attempts-- + if (attempts == 0) + user << "The crate's anti-tamper system activates!" + var/turf/T = get_turf(src.loc) + explosion(T, 0, 1, 2, 1) + del(src) + return + else + user << "You attempt to interact with the device using a hand gesture, but it appears this crate is from before the DECANECT came out." + return + else + return ..() + +/obj/structure/closet/crate/secure/loot/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(locked) + if (istype(W, /obj/item/weapon/card/emag)) + user << "The crate unlocks!" + locked = 0 + if (istype(W, /obj/item/device/multitool)) + user << "DECA-CODE LOCK REPORT:" + if (attempts == 1) + user << "* Anti-Tamper Bomb will activate on next failed access attempt." + else + user << "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts." + if (lastattempt == null) + user << " has been made to open the crate thus far." + return + // hot and cold + if (code > lastattempt) + user << "* Last access attempt lower than expected code." + else + user << "* Last access attempt higher than expected code." + else ..() + else ..() diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 83077154a8..c410a51c00 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -486,7 +486,11 @@ commented out in r5061, I left it because of the shroom thingies var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) N.fullUpdateMineralOverlays() - + var/crate = rand(1,30) + switch(crate) + if(1) + visible_message("After digging, you find an old dusty crate buried within!") + new/obj/structure/closet/crate/secure/loot(src) return /turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ab8b95e111..7b1c2bd22b 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1746,6 +1746,7 @@ datum/design/cart_security build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/security" + locked = 1 datum/design/cart_janitor name = "CustodiPRO Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1786,6 +1787,7 @@ datum/design/cart_quartermaster build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/quartermaster" + locked = 1 datum/design/cart_hop name = "Human Resources 9001 Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1794,6 +1796,7 @@ datum/design/cart_hop build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/hop" + locked = 1 datum/design/cart_hos name = "R.O.B.U.S.T. DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1802,6 +1805,7 @@ datum/design/cart_hos build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/hos" + locked = 1 datum/design/cart_ce name = "Power-On DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1810,6 +1814,7 @@ datum/design/cart_ce build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/ce" + locked = 1 datum/design/cart_cmo name = "Med-U DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1818,6 +1823,7 @@ datum/design/cart_cmo build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/cmo" + locked = 1 datum/design/cart_rd name = "Signal Ace DELUXE Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1826,6 +1832,7 @@ datum/design/cart_rd build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/rd" + locked = 1 datum/design/cart_captain name = "Value-PAK Cartridge" desc = "A data cartridge for portable microcomputers." @@ -1834,6 +1841,7 @@ datum/design/cart_captain build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/captain" + locked = 1 datum/design/cart_traitor name = "Detomatix Cart" desc = "A data cartridge for portable microcomputers." @@ -1841,4 +1849,4 @@ datum/design/cart_traitor req_tech = list("syndicate" = 2, "powerstorage" = 3) build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) - build_path = "/obj/item/weapon/cartridge/syndicate" \ No newline at end of file + build_path = "/obj/item/weapon/cartridge/syndicate" From 7dcb47ec2acdd0271d4e56c50a8ee2df7d59373f Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Wed, 20 Nov 2013 15:19:24 -0800 Subject: [PATCH 29/36] R.I.P H.O.N.KBlaster 9000. You died as you lived. Hidden in a crate. --- code/modules/mining/abandonedcrates.dm | 23 +++++------------------ code/modules/research/designs.dm | 8 -------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 72ddbffe4a..d55c7e329a 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -30,9 +30,6 @@ for(var/i = 0, i < 12, i++) new/obj/item/weapon/coin/diamond(src) if(4) - new/obj/item/clothing/shoes/clown_shoes(src) - new/obj/item/clothing/under/rank/clown(src) - new/obj/item/clothing/mask/gas/clown_hat(src) new/obj/item/weapon/bananapeel(src) if(5) for(var/i = 0, i < 6, i++) @@ -40,12 +37,9 @@ new/obj/item/weapon/lighter/zippo(src) if(7) new/obj/item/weapon/reagent_containers/glass/beaker/bluespace(src) - if(9) - for(var/i = 0, i < 5, i++) + if(9 to 10) + for(var/i = 0, i < 10, i++) new/obj/item/weapon/ore/diamond(src) - if(10) - for(var/i = 0, i < 5, i++) - new/obj/item/weapon/ore/clown(src) if(11) return if(12) @@ -58,18 +52,9 @@ if(15) for(var/i = 0, i < 3, i++) new/obj/item/weapon/reagent_containers/glass/beaker/noreact(src) - new/obj/item/weapon/reagent_containers/hypospray(src) - if(16) + if(16 to 17) for(var/i = 0, i < 9, i++) new/obj/item/bluespace_crystal(src) - if(17) - new/obj/item/mecha_parts/mecha_equipment/weapon/honker(src) - new/obj/item/mecha_parts/chassis/honker(src) - new/obj/item/mecha_parts/part/honker_torso(src) - new/obj/item/mecha_parts/part/honker_head(src) - new/obj/item/mecha_parts/part/honker_left_arm(src) - if(18) - return if(19) for(var/i = 0, i < 4, i++) new/obj/item/weapon/melee/classic_baton(src) @@ -92,6 +77,8 @@ return if(6) return + if(18) + return //Dummy crates end here. if(30) for(var/i = 0, i < 4, i++) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 5e7c4ce913..abc4b66868 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1859,12 +1859,4 @@ datum/design/cart_traitor req_tech = list("syndicate" = 2, "powerstorage" = 3) build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) -<<<<<<< HEAD -<<<<<<< HEAD build_path = "/obj/item/weapon/cartridge/syndicate" -======= - build_path = "/obj/item/weapon/cartridge/syndicate" ->>>>>>> 60f644c4014e7ae0ca8267e271c8985574039f2b -======= - build_path = "/obj/item/weapon/cartridge/syndicate" ->>>>>>> ab43cc9cd6179a50395854c59eccfb43a651641b From ac4e42bb2a7bcc6392476dc557967ab4573019fb Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Wed, 20 Nov 2013 15:29:33 -0800 Subject: [PATCH 30/36] After a very prolonged set of Syndicate budget cuts, Detomatix PDA carts are no longer buildable --- code/modules/research/designs.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index abc4b66868..b9d25c2677 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1852,11 +1852,3 @@ datum/design/cart_captain materials = list("$metal" = 50, "$glass" = 50) build_path = "/obj/item/weapon/cartridge/captain" locked = 1 -datum/design/cart_traitor - name = "Detomatix Cart" - desc = "A data cartridge for portable microcomputers." - id = "cart_traitor" - req_tech = list("syndicate" = 2, "powerstorage" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 50, "$glass" = 50) - build_path = "/obj/item/weapon/cartridge/syndicate" From d72d845cbaaaf070631e435c35ef77f800cff18b Mon Sep 17 00:00:00 2001 From: Higgin Date: Wed, 20 Nov 2013 16:00:07 -0800 Subject: [PATCH 31/36] Fix to fix a fix that needs fixing. --- code/modules/projectiles/projectile.dm | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 1598a261fe..d8ff676708 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -88,24 +88,6 @@ var/distance = get_dist(starting,loc) var/miss_modifier = -30 - if(def_zone == "l_arm") - miss_modifier += 10 - if(def_zone == "r_arm") - miss_modifier += 10 - if(def_zone == "l_leg") - miss_modifier += 5 - if(def_zone == "r_leg") - miss_modifier += 5 - if(def_zone == "head") - miss_modifier += 20 - if(def_zone == "l_hand") - miss_modifier += 25 - if(def_zone == "r_hand") - miss_modifier += 25 - if(def_zone == "l_foot") - miss_modifier += 23 - if(def_zone == "r_foot") - miss_modifier += 23 if (istype(shot_from,/obj/item/weapon/gun)) //If you aim at someone beforehead, it'll hit more often. var/obj/item/weapon/gun/daddy = shot_from //Kinda balanced by fact you need like 2 seconds to aim From 43bde0598dcf568614cad56f8637c6d90a830e18 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Wed, 20 Nov 2013 18:10:14 -0800 Subject: [PATCH 32/36] Uncommented the dressing up corgi code! Have fun replacing the condom! Also adds a player requested item. http://baystation12.net/forums/viewtopic.php?f=33&t=9120 Rainbow Belt --- code/modules/customitems/item_defines.dm | 9 +++++++++ .../living/simple_animal/friendly/corgi.dm | 2 -- icons/mob/belt_mirror.dmi | Bin 1781 -> 4681 bytes icons/obj/custom_items.dmi | Bin 49877 -> 50623 bytes 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 98331e8fcc..457c64dbf7 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -921,3 +921,12 @@ if(istype(A, /obj/item/ammo_magazine)) flick("leamas-reloading",src) ..() + + +///// Custom Items coded by Iamgoofball are Below ///// +/obj/item/weapon/storage/belt/medical/fluff/honkbelt + name = "rainbow medical belt" + desc = "A somewhat-worn, modified, rainbow belt." + icon = 'icons/obj/custom_items.dmi' + icon_state = "nashi_belt" + item_state = "fluff_rbelt" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 54431d86f7..0141d9c5c1 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -27,7 +27,6 @@ regenerate_icons() /mob/living/simple_animal/corgi/show_inv(mob/user as mob) - /* If you're turning this back on, scroll down and uncomment target_updated user.set_machine(src) if(user.stat) return @@ -43,7 +42,6 @@ user << browse(dat, text("window=mob[];size=325x500", name)) onclose(user, "mob[real_name]") - */ return /mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/belt_mirror.dmi index 36392855550c53268241e45c78d2d6742ac7436c..9358ba3cd92eb28f36a08756abcc6658e5961a18 100644 GIT binary patch literal 4681 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 E0G8c3Jpcdz diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 0b82c58bcca70b1aa1d9c129e5dde9400c94c9db..5cc07c12b3862ce5e38d623391c54610c56fbec0 100644 GIT binary patch delta 11533 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 From 48150acc5a0224b67c028e08b38d2a9dc855598b Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 21 Nov 2013 12:21:50 +0400 Subject: [PATCH 33/36] Removed earrape --- code/game/turfs/simulated.dm | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 6432f1bac7..500eb25a9f 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -23,16 +23,6 @@ if(M.lying) return if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(istype(H.shoes, /obj/item/clothing/shoes/clown_shoes)) - var/obj/item/clothing/shoes/clown_shoes/O = H.shoes - if(H.m_intent == "run") - if(O.footstep >= 2) - O.footstep = 0 - playsound(src, "clownstep", 50, 1) // this will get annoying very fast. - else - O.footstep++ - else - playsound(src, "clownstep", 20, 1) var/list/bloodDNA = null if(H.shoes) From c50c401a85164e583f2af88db7fdad4c1a5939ec Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 21 Nov 2013 13:46:16 +0400 Subject: [PATCH 34/36] Walking on tile makes it dirty. Takes 40 times for mob to enter tile for dirt overlay to appear. Mopping resets dirtiness level. --- code/game/objects/items/weapons/mop.dm | 1 + code/game/turfs/simulated.dm | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 27935c4f87..a3e71cd8cd 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -21,6 +21,7 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) if(reagents.has_reagent("water", 1)) A.clean_blood() + A.dirt = 0 for(var/obj/effect/O in A) if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) del(O) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 500eb25a9f..2598a63244 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -8,7 +8,7 @@ nitrogen = MOLES_N2STANDARD var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to - + var/dirt = 0 /turf/simulated/New() ..() levelupdate() @@ -21,6 +21,11 @@ if (istype(A,/mob/living/carbon)) var/mob/living/carbon/M = A if(M.lying) return + dirt++ + if (dirt > 40) + dirt = 0 + if (!locate(/obj/effect/decal/cleanable/dirt, src)) + new/obj/effect/decal/cleanable/dirt(src) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M From 69dbec4920cc1fdf1ad9ed8d3469417b45c0d3c4 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Thu, 21 Nov 2013 09:08:30 -0600 Subject: [PATCH 35/36] Custom Item Request Confirmed with Apple that this was acceptable. --- code/modules/customitems/item_defines.dm | 24 +++++++++++++++++++++-- code/modules/customitems/item_spawning.dm | 19 +++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 457c64dbf7..afbbc43b8b 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -924,9 +924,29 @@ ///// Custom Items coded by Iamgoofball are Below ///// -/obj/item/weapon/storage/belt/medical/fluff/honkbelt +/obj/item/weapon/storage/belt/medical/fluff/nashi_belt name = "rainbow medical belt" desc = "A somewhat-worn, modified, rainbow belt." icon = 'icons/obj/custom_items.dmi' icon_state = "nashi_belt" - item_state = "fluff_rbelt" \ No newline at end of file + item_state = "fluff_rbelt" + + New() + ..() + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "bicaridine", 14, "Bicaridine") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "dermaline", 15, "Dermaline") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "anti_toxin", 16, "Dylovene") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "dexalinp", 17, "Dexalin Plus") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "tricordrazine", 18, "Tricordrazine") + new /obj/item/weapon/reagent_containers/syringe/(src) + new /obj/item/device/healthanalyzer(src) + +/obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle + icon = 'icons/obj/chemical.dmi' + flags = FPRINT | TABLEPASS //Starting them with lids on them. Safety first! + New(loc, var/stuff, var/color, var/labeled) + ..() + name = "[labeled] bottle" + desc = "A small bottle. Contains [labeled]" + icon_state = "bottle[color]" + reagents.add_reagent(stuff, 30) diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index ffcc19b7b7..8682f6f69e 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -57,6 +57,23 @@ del(C) ok = M.equip_if_possible(I, slot_wear_id, 0) //if 1, last argument deletes on fail break + else if(istype(Item,/obj/item/weapon/storage/belt)) + if(M.ckey == "jakksergal" && M.real_name == "Nashi Ra'hal" && M.mind.role_alt_title && M.mind.role_alt_title != "Nurse" && M.mind.role_alt_title != "Chemist") + ok = 1 + del(Item) + goto skip + var/obj/item/weapon/storage/belt/medical/fluff/nashi_belt/I = Item + if(istype(M.belt,/obj/item/weapon/storage/belt)) + for(var/obj/item/weapon/storage/belt/B in M) + del(B) + M.belt=null + ok = M.equip_if_possible(I, slot_belt, 0) + break + if(istype(M.belt,/obj/item/device/pda)) + for(var/obj/item/device/pda/Pda in M) + M.belt=null + M.equip_if_possible(Pda, slot_l_store, 0) + ok = M.equip_if_possible(I, slot_belt, 0) else if(istype(M.back,/obj/item/weapon/storage) && M.back:contents.len < M.back:storage_slots) // Try to place it in something on the mob's back Item.loc = M.back ok = 1 @@ -70,4 +87,4 @@ skip: if (ok == 0) // Finally, since everything else failed, place it on the ground - Item.loc = get_turf(M.loc) \ No newline at end of file + Item.loc = get_turf(M.loc) From dd77eae4056f047eee34f405090ae4b860a65948 Mon Sep 17 00:00:00 2001 From: Nanai Date: Thu, 21 Nov 2013 16:54:01 -0500 Subject: [PATCH 36/36] Custom Belt Fix Edited issue with chemicals spawned. --- code/modules/customitems/item_defines.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index afbbc43b8b..05bb2a30dd 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -933,20 +933,19 @@ New() ..() - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "bicaridine", 14, "Bicaridine") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "dermaline", 15, "Dermaline") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "anti_toxin", 16, "Dylovene") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "dexalinp", 17, "Dexalin Plus") - new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, "tricordrazine", 18, "Tricordrazine") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 14, "Bicaridine") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 15, "Dermaline") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 16, "Dylovene") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 17, "Dexalin Plus") + new /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle(src, 18, "Tricordrazine") new /obj/item/weapon/reagent_containers/syringe/(src) new /obj/item/device/healthanalyzer(src) /obj/item/weapon/reagent_containers/glass/bottle/fluff/nashi_bottle icon = 'icons/obj/chemical.dmi' flags = FPRINT | TABLEPASS //Starting them with lids on them. Safety first! - New(loc, var/stuff, var/color, var/labeled) + New(loc, var/color, var/labeled) ..() name = "[labeled] bottle" desc = "A small bottle. Contains [labeled]" icon_state = "bottle[color]" - reagents.add_reagent(stuff, 30)