From 98d983577c8e4b81cb0e9ef5f0fa958d8acff38f Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 7 Feb 2016 16:07:05 +1030 Subject: [PATCH] Revert "Bay update." --- bot/NanoTrasenBot.py | 94 ++--- code/ATMOSPHERICS/datum_pipeline.dm | 3 + code/__defines/atmos.dm | 1 - code/__defines/math_physics.dm | 1 - code/__defines/mobs.dm | 1 - code/_onclick/click.dm | 2 +- code/_onclick/hud/movable_screen_objects.dm | 50 +-- code/_onclick/hud/spell_screen_objects.dm | 52 +-- code/controllers/voting.dm | 6 +- code/datums/datacore.dm | 8 +- code/game/asteroid.dm | 84 +++++ code/game/atoms_movable.dm | 4 +- code/game/gamemodes/game_mode.dm | 2 - .../game/gamemodes/malfunction/malfunction.dm | 1 - code/game/jobs/job/civilian.dm | 73 ++++ code/game/jobs/job_controller.dm | 40 ++- code/game/jobs/jobprocs.dm | 66 ++++ code/game/machinery/adv_med.dm | 2 +- code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/security.dm | 2 +- .../machinery/computer3/computers/medical.dm | 2 +- .../machinery/computer3/computers/security.dm | 2 +- code/game/machinery/computer3/lapvend.dm | 86 ++--- code/game/machinery/doors/door.dm | 4 +- code/game/machinery/rechargestation.dm | 21 +- code/game/machinery/records_scanner.dm | 2 +- code/game/machinery/suit_storage_unit.dm | 5 +- code/game/mecha/mecha.dm | 5 - .../effects/decals/Cleanable/humans.dm | 2 +- code/game/objects/items.dm | 6 - .../objects/items/devices/chameleonproj.dm | 2 - code/game/objects/items/devices/paicard.dm | 2 +- code/game/objects/items/robot/robot_items.dm | 4 - code/game/objects/items/weapons/cards_ids.dm | 2 +- .../game/objects/items/weapons/clown_items.dm | 15 +- .../items/weapons/grenades/chem_grenade.dm | 2 +- .../objects/items/weapons/implants/implant.dm | 1 - code/game/objects/items/weapons/kitchen.dm | 0 .../objects/items/weapons/material/kitchen.dm | 14 +- code/game/objects/items/weapons/mop.dm | 16 +- .../objects/items/weapons/storage/lockbox.dm | 4 +- .../objects/items/weapons/storage/secure.dm | 2 +- .../structures/crates_lockers/closets.dm | 5 +- .../crates_lockers/closets/secure/personal.dm | 5 +- .../closets/secure/secure_closets.dm | 7 +- code/game/objects/structures/window.dm | 8 +- code/game/turfs/turf.dm | 15 - code/game/verbs/ooc.dm | 2 +- code/game/verbs/suicide.dm | 3 +- code/modules/admin/admin.dm | 43 +-- code/modules/admin/admin_verbs.dm | 3 + code/modules/admin/topic.dm | 9 +- code/modules/admin/verbs/buildmode.dm | 1 - code/modules/admin/verbs/icarus.dm | 129 +++++++ code/modules/admin/verbs/randomverbs.dm | 3 +- code/modules/client/client procs.dm | 1 - code/modules/client/preferences.dm | 2 +- code/modules/client/preferences_factions.dm | 2 +- code/modules/client/preferences_gear.dm | 54 ++- code/modules/client/preferences_savefile.dm | 2 +- .../spacesuits/rig/modules/utility.dm | 2 - .../clothing/spacesuits/rig/suits/ert.dm | 2 +- .../clothing/spacesuits/rig/suits/light.dm | 2 +- .../clothing/spacesuits/rig/suits/station.dm | 12 +- code/modules/hydroponics/grown.dm | 1 - code/modules/hydroponics/seed.dm | 3 - code/modules/hydroponics/trays/tray.dm | 39 +-- code/modules/materials/material_recipes.dm | 2 +- code/modules/materials/materials.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 2 - code/modules/mob/emote.dm | 3 +- code/modules/mob/inventory.dm | 56 ++- code/modules/mob/living/bot/cleanbot.dm | 136 ++++---- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/give.dm | 83 +++-- .../mob/living/carbon/human/examine.dm | 4 + code/modules/mob/living/carbon/human/human.dm | 51 +-- .../living/carbon/human/human_attackhand.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 8 +- .../mob/living/carbon/human/human_helpers.dm | 37 -- .../mob/living/carbon/human/human_movement.dm | 4 +- .../mob/living/carbon/human/human_organs.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 10 +- code/modules/mob/living/carbon/human/life.dm | 44 +-- .../living/carbon/human/species/species.dm | 18 +- .../carbon/human/species/station/station.dm | 1 - .../mob/living/carbon/human/unarmed_attack.dm | 12 +- .../mob/living/carbon/human/update_icons.dm | 39 ++- .../mob/living/carbon/metroid/items.dm | 1 - .../modules/mob/living/carbon/metroid/life.dm | 10 +- .../mob/living/carbon/metroid/metroid.dm | 3 - code/modules/mob/living/silicon/ai/ai.dm | 32 +- code/modules/mob/living/silicon/ai/examine.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 8 +- .../mob/living/silicon/robot/robot_modules.dm | 4 +- .../simple_animal/borer/borer_powers.dm | 2 +- .../simple_animal/constructs/soulstone.dm | 323 +++++++++--------- .../modules/mob/living/simple_animal/shade.dm | 3 +- code/modules/mob/mob.dm | 20 +- code/modules/mob/mob_grab_specials.dm | 2 +- code/modules/mob/mob_helpers.dm | 6 - code/modules/mob/mob_movement.dm | 2 +- .../mob/new_player/preferences_setup.dm | 19 +- code/modules/organs/organ.dm | 3 +- code/modules/organs/organ_external.dm | 75 ++-- code/modules/organs/subtypes/diona.dm | 3 +- code/modules/organs/subtypes/machine.dm | 1 - code/modules/paperwork/paperbin.dm | 1 - code/modules/power/apc.dm | 9 +- code/modules/power/cable.dm | 2 +- code/modules/projectiles/gun.dm | 5 +- .../projectiles/guns/energy/special.dm | 52 +++ .../modules/projectiles/projectile/special.dm | 15 +- code/modules/random_map/random_map.dm | 3 +- code/modules/reagents/Chemistry-Holder.dm | 2 +- code/modules/reagents/Chemistry-Machinery.dm | 1 - .../reagent_containers/food/drinks/jar.dm | 38 ++- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/reagents/reagent_dispenser.dm | 4 +- code/modules/recycling/disposal.dm | 28 +- .../artifact/artifact_unknown.dm | 2 +- .../machinery/artifact_analyser.dm | 5 +- code/modules/shuttles/shuttle_console.dm | 8 +- code/modules/spells/targeted/mind_transfer.dm | 20 +- code/modules/surgery/generic.dm | 4 +- code/modules/surgery/organs_internal.dm | 5 - code/modules/surgery/robotics.dm | 1 - code/modules/xgm/xgm_gas_mixture.dm | 23 +- config/names/ai.txt | 178 +++++++--- config/names/death_commando.txt | 3 +- html/changelog.html | 15 - html/changelogs/.all_changelog.yml | 24 +- maps/PowerTesting.dmm | 121 +++++++ polaris.dme | 5 +- tools/mapmerge/2clean_map.bat | 2 +- tools/mapmerge/clean_map_git.sh | 11 +- 136 files changed, 1512 insertions(+), 1162 deletions(-) create mode 100644 code/game/asteroid.dm create mode 100644 code/game/jobs/jobprocs.dm create mode 100644 code/game/objects/items/weapons/kitchen.dm create mode 100644 code/modules/admin/verbs/icarus.dm delete mode 100644 code/modules/mob/living/carbon/human/human_helpers.dm create mode 100644 maps/PowerTesting.dmm diff --git a/bot/NanoTrasenBot.py b/bot/NanoTrasenBot.py index 6f65a11daf..e86009ef58 100644 --- a/bot/NanoTrasenBot.py +++ b/bot/NanoTrasenBot.py @@ -35,9 +35,10 @@ except ImportError: try: tiedosto = open("psycodownload.txt","r") except: - with open("psycodownload.txt","w") as tiedosto: - tiedosto.write("http://www.voidspace.org.uk/python/modules.shtml#psyco") - tiedosto.write("\nhttp://psyco.sourceforge.net/download.html") + tiedosto = open("psycodownload.txt","w") + tiedosto.write("http://www.voidspace.org.uk/python/modules.shtml#psyco") + tiedosto.write("\nhttp://psyco.sourceforge.net/download.html") + tiedosto.close() print "Check psycodownload.txt for a link" else: print "For god's sake, open psycodownload.txt" @@ -189,13 +190,15 @@ tell_list = {} if CORE_DATA.DISABLE_ALL_NON_MANDATORY_SOCKET_CONNECTIONS: nudgeable = False try: - with open("replacenames.cache","r") as tiedosto: - replacenames = pickle.load(tiedosto) + tiedosto = open("replacenames.cache","r") + replacenames = pickle.load(tiedosto) + tiedosto.close() for i in replacenames.values(): if len(i) > call_me_max_length: replacenames[replacenames.keys()[replacenames.values().index(i)]] = i[:call_me_max_length] - with open("replacenames.cache","w") as tiedosto: - pickle.dump(replacenames,tiedosto) + tiedosto = open("replacenames.cache","w") + pickle.dump(replacenames,tiedosto) + tiedosto.close() if "[\0x01]" in i.lower() or "[\\0x01]" in i.lower(): i = i.replace("[\0x01]","") i = i.replace("[\0X01]","") @@ -208,12 +211,13 @@ except EOFError: #Cache corrupt replacenames = {} print "replacenames.cache is corrupt and couldn't be loaded." try: - with open("peopleheknows.cache","r") as tiedosto: - peopleheknows = pickle.load(tiedosto) + tiedosto = open("peopleheknows.cache","r") + peopleheknows = pickle.load(tiedosto) + tiedosto.close() except IOError: peopleheknows = [[],[]] - with open("peopleheknows.cache","w") as tiedosto: - pass + tiedosto = open("peopleheknows.cache","w") + tiedosto.close() except EOFError: peopleheknows = [[],[]] print "peopleheknows.cache is corrupt and couldn't be loaded." @@ -341,14 +345,16 @@ if aggressive_pinging: self_time = 0 global backup,disconnects,conn while disconnects < 5: - if backup > self_time and time.time()-backup > delay: - conn.send("PONG "+pongtarg) - print "Ponged" - self_time = time.time() - elif time.time()-self_time > delay: - conn.send("PONG "+pongtarg) - print "Ponged" - self_time = time.time() + if backup > self_time: + if time.time()-backup > delay: + conn.send("PONG "+pongtarg) + print "Ponged" + self_time = time.time() + else: + if time.time()-self_time > delay: + conn.send("PONG "+pongtarg) + print "Ponged" + self_time = time.time() time.sleep(refresh) thread.start_new_thread(aggressive_ping,(aggressive_pinging_delay,aggressive_pinging_refresh,)) def stop(sender,debug=1): @@ -364,15 +370,16 @@ def stop(sender,debug=1): access_granted = True else: access_granted = False - if access_granted and debug: - print sender+":"+prefix+"stop" - if random.randint(0,100) == 50: - conn.privmsg(channel,"Hammertime!") - else: - conn.privmsg(channel,"Shutting down.") - disconnects = 99999 - conn.quit() - return True + if access_granted: + if debug: + print sender+":"+prefix+"stop" + if random.randint(0,100) == 50: + conn.privmsg(channel,"Hammertime!") + else: + conn.privmsg(channel,"Shutting down.") + disconnects = 99999 + conn.quit() + return True else: conn.privmsg(channel,"You cannot command me") return False @@ -394,12 +401,13 @@ def target(who,how_long): if debug: print "Banned",who,"For",how_long,"seconds" if logbans: - with open(targetdirectory+"banlog/"+str(int(start))+"-"+str(int(end))+".txt","w") as tiedosto: - tiedosto.write("Start of ban on "+who+":"+str(int(start))) - tiedosto.write("\n") - tiedosto.write("End of ban on "+who+":"+str(int(end))) - tiedosto.write("\n") - tiedosto.write("In total:"+str(int(end-start))+"Seconds") + tiedosto = open(targetdirectory+"banlog/"+str(int(start))+"-"+str(int(end))+".txt","w") + tiedosto.write("Start of ban on "+who+":"+str(int(start))) + tiedosto.write("\n") + tiedosto.write("End of ban on "+who+":"+str(int(end))) + tiedosto.write("\n") + tiedosto.write("In total:"+str(int(end-start))+"Seconds") + tiedosto.close() else: CALL_OFF = False pass @@ -568,12 +576,13 @@ while True: time.sleep(6) Name = origname conn.nick(Name) - if origname in truesender and influx == prefix+"stop": - time.sleep(0.5) #A small delay - conn.privmsg(channel,"Shutting down.") - conn.quit() - disconnects = 99999 - break + if origname in truesender: + if influx == prefix+"stop": + time.sleep(0.5) #A small delay + conn.privmsg(channel,"Shutting down.") + conn.quit() + disconnects = 99999 + break if len(translateable) > 0 and enabled == True: people = "-5|5|1-".join(users).lower() if truesender.lower() in translateable: @@ -624,8 +633,9 @@ while True: arg = influx.lower()[8+len(prefix):] if debug: print truesender+":"+prefix+"suggest "+arg - with open(targetdirectory+"suggestions/suggestions_"+str(int(time.time()))+".txt","a") as tiedosto: - tiedosto.write(arg) + tiedosto = open(targetdirectory+"suggestions/suggestions_"+str(int(time.time()))+".txt","a") + tiedosto.write(arg) + tiedosto.close() conn.privmsg(targetchannel,"Suggestion received") elif cocheck( prefix+"help "): #Space in front of the ( to make sure that my command finder does not pick this up. arg = " ".join(influx.split(" ")[1:]).lower() diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 44c7cd2590..f4f4e37990 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -28,6 +28,9 @@ datum/pipeline if(!member.check_pressure(pressure)) break //Only delete 1 pipe per process + //Allow for reactions + //air.react() //Should be handled by pipe_network now + proc/temporarily_store_air() //Update individual gas_mixtures by volume ratio diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm index f67c967157..668178abfc 100644 --- a/code/__defines/atmos.dm +++ b/code/__defines/atmos.dm @@ -19,7 +19,6 @@ #define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME / (T20C * R_IDEAL_GAS_EQUATION)) // Amount of air to take a from a tile #define BREATH_PERCENTAGE (BREATH_VOLUME / CELL_VOLUME) // Amount of air needed before pass out/suffocation commences. #define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD * BREATH_PERCENTAGE * 0.16) -#define HUMAN_HEAT_CAPACITY 280000 //J/K For 80kg person #define SOUND_MINIMUM_PRESSURE 10 diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm index 987cb1ba9d..7c7c6d0d85 100644 --- a/code/__defines/math_physics.dm +++ b/code/__defines/math_physics.dm @@ -13,7 +13,6 @@ #define GAS_CRITICAL_TEMPERATURE 132.65 // K. The critical point temperature for air. #define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)). Unitless ratio. -#define HUMAN_EXPOSED_SURFACE_AREA 5.2 //m^2, surface area of 1.7m (H) x 0.46m (D) cylinder #define T0C 273.15 // 0.0 degrees celcius #define T20C 293.15 // 20.0 degrees celcius diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 98ad3b28ca..8c7acf05a2 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -25,7 +25,6 @@ #define BORGMESON 0x1 #define BORGTHERM 0x2 #define BORGXRAY 0x4 -#define BORGMATERIAL 8 #define HOSTILE_STANCE_IDLE 1 #define HOSTILE_STANCE_ALERT 2 diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 9fa5fa3654..6c30801b15 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -269,7 +269,7 @@ user.listed_turf = null else user.listed_turf = T - user.client.statpanel = "Turf" + user.client.statpanel = T.name return 1 /mob/proc/TurfAdjacent(var/turf/T) diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index d543b8b12a..5034606256 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -1,4 +1,3 @@ - ////////////////////////// //Movable Screen Objects// // By RemieRichards // @@ -31,10 +30,9 @@ //Split X+Pixel_X up into list(X, Pixel_X) var/list/screen_loc_X = text2list(screen_loc_params[1],":") - screen_loc_X[1] = encode_screen_X(text2num(screen_loc_X[1])) + //Split Y+Pixel_Y up into list(Y, Pixel_Y) var/list/screen_loc_Y = text2list(screen_loc_params[2],":") - screen_loc_Y[1] = encode_screen_Y(text2num(screen_loc_Y[1])) if(snap2grid) //Discard Pixel Values screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" @@ -44,50 +42,8 @@ var/pix_Y = text2num(screen_loc_Y[2]) - 16 screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" -/obj/screen/movable/proc/encode_screen_X(X) - if(X > usr.client.view+1) - . = "EAST-[usr.client.view*2 + 1-X]" - else if(X < usr.client.view+1) - . = "WEST+[X-1]" - else - . = "CENTER" + moved = TRUE -/obj/screen/movable/proc/decode_screen_X(X) - //Find EAST/WEST implementations - if(findtext(X,"EAST-")) - var/num = text2num(copytext(X,6)) //Trim EAST- - if(!num) - num = 0 - . = usr.client.view*2 + 1 - num - else if(findtext(X,"WEST+")) - var/num = text2num(copytext(X,6)) //Trim WEST+ - if(!num) - num = 0 - . = num+1 - else if(findtext(X,"CENTER")) - . = usr.client.view+1 - -/obj/screen/movable/proc/encode_screen_Y(Y) - if(Y > usr.client.view+1) - . = "NORTH-[usr.client.view*2 + 1-Y]" - else if(Y < usr.client.view+1) - . = "SOUTH+[Y-1]" - else - . = "CENTER" - -/obj/screen/movable/proc/decode_screen_Y(Y) - if(findtext(Y,"NORTH-")) - var/num = text2num(copytext(Y,7)) //Trim NORTH- - if(!num) - num = 0 - . = usr.client.view*2 + 1 - num - else if(findtext(Y,"SOUTH+")) - var/num = text2num(copytext(Y,7)) //Time SOUTH+ - if(!num) - num = 0 - . = num+1 - else if(findtext(Y,"CENTER")) - . = usr.client.view+1 //Debug procs /client/proc/test_movable_UI() @@ -125,4 +81,4 @@ S.screen_loc = screen_l - screen += S + screen += S \ No newline at end of file diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index a59474749a..31f6fbcb86 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -19,12 +19,9 @@ spell_objects.Cut() if(spell_holder) spell_holder.spell_masters -= src - if(spell_holder.client && spell_holder.client.screen) - spell_holder.client.screen -= src - spell_holder = null /obj/screen/movable/spell_master/ResetVars() - ..("spell_objects", args) + ..("spell_objects") spell_objects = list() /obj/screen/movable/spell_master/MouseDrop() @@ -50,34 +47,25 @@ overlays.len = 0 overlays.Add(closed_state) else if(forced_state != 1) - open_spellmaster() + var/temp_loc = screen_loc + + var/x_position = text2num(copytext(temp_loc, 1, findtext(temp_loc, ":"))) + var/x_pix = text2num(copytext(temp_loc, findtext(temp_loc, ":") + 1, findtext(temp_loc, ","))) + temp_loc = copytext(temp_loc, findtext(temp_loc, ",") + 1) + var/y_position = text2num(copytext(temp_loc, 1, findtext(temp_loc, ":"))) + var/y_pix = text2num(copytext(temp_loc, findtext(temp_loc, ":")+1)) + + for(var/i = 1; i <= spell_objects.len; i++) + var/obj/screen/spell/S = spell_objects[i] + S.screen_loc = "[x_position + (x_position < 8 ? 1 : -1)*(i%7)]:[x_pix],[y_position + (y_position < 8 ? round(i/7) : -round(i/7))]:[y_pix]" + if(spell_holder && spell_holder.client) + spell_holder.client.screen += S + S.handle_icon_updates = 1 update_spells(1) showing = 1 overlays.len = 0 overlays.Add(open_state) -/obj/screen/movable/spell_master/proc/open_spellmaster() - var/list/screen_loc_xy = text2list(screen_loc,",") - - //Create list of X offsets - var/list/screen_loc_X = text2list(screen_loc_xy[1],":") - var/x_position = decode_screen_X(screen_loc_X[1]) - var/x_pix = screen_loc_X[2] - - //Create list of Y offsets - var/list/screen_loc_Y = text2list(screen_loc_xy[2],":") - var/y_position = decode_screen_Y(screen_loc_Y[1]) - var/y_pix = screen_loc_Y[2] - - for(var/i = 1; i <= spell_objects.len; i++) - var/obj/screen/spell/S = spell_objects[i] - var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7) - var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7)) - S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" - if(spell_holder && spell_holder.client) - spell_holder.client.screen += S - S.handle_icon_updates = 1 - /obj/screen/movable/spell_master/proc/add_spell(var/spell/spell) if(!spell) return @@ -86,14 +74,13 @@ return else spell_objects.Add(spell.connected_button) - if(spell_holder.client) - toggle_open(2) + toggle_open(2) return if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one return - var/obj/screen/spell/newscreen = PoolOrNew(/obj/screen/spell) + var/obj/screen/spell/newscreen = new /obj/screen/spell newscreen.spellmaster = src newscreen.spell = spell @@ -109,8 +96,7 @@ newscreen.name = spell.name newscreen.update_charge(1) spell_objects.Add(newscreen) - if(spell_holder.client) - toggle_open(2) //forces the icons to refresh on screen + toggle_open(2) //forces the icons to refresh on screen /obj/screen/movable/spell_master/proc/remove_spell(var/spell/spell) qdel(spell.connected_button) @@ -165,8 +151,6 @@ last_charged_icon = null if(spellmaster) spellmaster.spell_objects -= src - if(spellmaster.spell_holder && spellmaster.spell_holder.client) - spellmaster.spell_holder.client.screen -= src if(spellmaster && !spellmaster.spell_objects.len) qdel(spellmaster) spellmaster = null diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index efab120483..29008770f5 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -39,12 +39,12 @@ datum/controller/vote result() for(var/client/C in voting) if(C) - C << browse(null,"window=vote") + C << browse(null,"window=vote;can_close=0") reset() else for(var/client/C in voting) if(C) - C << browse(vote.interface(C),"window=vote") + C << browse(vote.interface(C),"window=vote;can_close=0") voting.Cut() @@ -392,4 +392,4 @@ datum/controller/vote set name = "Vote" if(vote) - src << browse(vote.interface(client),"window=vote") + src << browse(vote.interface(client),"window=vote;can_close=0") diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index f9b05a3afe..afe5bd01c3 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -166,7 +166,7 @@ if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1)) var/assignment = GetAssignment(H) - var/id = generate_record_id() + var/id = add_zero(num2hex(rand(1, 65535)), 4) //no point generating higher numbers because of the limitations of num2hex //General Record var/datum/data/record/G = CreateGeneralRecord(H, id) G.fields["name"] = H.real_name @@ -222,10 +222,8 @@ locked += L return -/proc/generate_record_id() - return add_zero(num2hex(rand(1, 65535)), 4) //no point generating higher numbers because of the limitations of num2hex - -/proc/get_id_photo(var/mob/living/carbon/human/H, var/assigned_role) +// TODO. +proc/get_id_photo(var/mob/living/carbon/human/H, var/assigned_role) var/icon/preview_icon = null var/g = "m" diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm new file mode 100644 index 0000000000..795970068c --- /dev/null +++ b/code/game/asteroid.dm @@ -0,0 +1,84 @@ + +var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger =4, + /obj/item/weapon/pickaxe/silver =4, + /obj/item/weapon/pickaxe/drill =4, + /obj/item/weapon/pickaxe/jackhammer =4, + //mob/living/simple_animal/hostile/carp =3, + /obj/item/weapon/pickaxe/diamond =3, + /obj/item/weapon/pickaxe/diamonddrill =3, + /obj/item/weapon/pickaxe/gold =3, + /obj/item/weapon/pickaxe/plasmacutter =2, + /obj/structure/closet/syndicate/resources =2, + /obj/item/weapon/melee/energy/sword/pirate =1, + /obj/mecha/working/ripley/mining =1 + ) + +var/global/list/spawned_surprises = list() + +var/global/max_secret_rooms = 3 + +proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor , var/clean = 0 , var/name) + var/list/room_turfs = list("walls"=list(),"floors"=list()) + + //world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]" + if(!wall) + wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall,/obj/effect/alien/resin) + if(!floor) + floor = pick(/turf/simulated/floor,/turf/simulated/floor/tiled,/turf/simulated/floor/reinforced) + + for(var/x = 0,x 0, i--) + for(var/level = 1 to 3) + var/list/candidates = list() + if(ticker.mode.name == "AI malfunction")//Make sure they want to malf if its malf + candidates = FindOccupationCandidates(job, level, BE_MALF) + else + candidates = FindOccupationCandidates(job, level) + if(candidates.len) + var/mob/new_player/candidate = pick(candidates) + if(AssignRole(candidate, "AI")) + ai_selected++ + break + //Malf NEEDS an AI so force one if we didn't get a player who wanted it + if((ticker.mode.name == "AI malfunction")&&(!ai_selected)) + unassigned = shuffle(unassigned) + for(var/mob/new_player/player in unassigned) + if(jobban_isbanned(player, "AI")) continue + if(AssignRole(player, "AI")) + ai_selected++ + break + if(ai_selected) return 1 + return 0 + + /** Proc DivideOccupations * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". @@ -236,6 +266,11 @@ var/global/datum/controller/occupations/job_master FillHeadPosition() Debug("DO, Head Check end") + //Check for an AI + Debug("DO, Running AI Check") + FillAIPosition() + Debug("DO, AI Check end") + //Other jobs are now checked Debug("DO, Running Standard Check") @@ -246,7 +281,6 @@ var/global/datum/controller/occupations/job_master // Loop through all levels from high to low var/list/shuffledoccupations = shuffle(occupations) - // var/list/disabled_jobs = ticker.mode.disabled_jobs // So we can use .Find down below without a colon. for(var/level = 1 to 3) //Check the head jobs first each level CheckHeadPositions(level) @@ -256,7 +290,7 @@ var/global/datum/controller/occupations/job_master // Loop through all jobs for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY - if(!job || ticker.mode.disabled_jobs.Find(job.title) ) + if(!job) continue if(jobban_isbanned(player, job.title)) @@ -448,7 +482,7 @@ var/global/datum/controller/occupations/job_master if(istype(H)) //give humans wheelchairs, if they need them. var/obj/item/organ/external/l_foot = H.get_organ("l_foot") var/obj/item/organ/external/r_foot = H.get_organ("r_foot") - if(!l_foot || !r_foot) + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc) H.buckled = W H.update_canmove() diff --git a/code/game/jobs/jobprocs.dm b/code/game/jobs/jobprocs.dm new file mode 100644 index 0000000000..2a012872bf --- /dev/null +++ b/code/game/jobs/jobprocs.dm @@ -0,0 +1,66 @@ + + +//TODO: put these somewhere else +/client/proc/mimewall() + set category = "Mime" + set name = "Invisible wall" + set desc = "Create an invisible wall on your location." + if(usr.stat) + usr << "Not when you're incapicated." + return + if(!ishuman(usr)) + return + + var/mob/living/carbon/human/H = usr + + if(!H.miming) + usr << "You still haven't atoned for your speaking transgression. Wait." + return + H.verbs -= /client/proc/mimewall + spawn(300) + H.verbs += /client/proc/mimewall + for (var/mob/V in viewers(H)) + if(V!=usr) + V.show_message("[H] looks as if a wall is in front of them.", 3, "", 2) + usr << "You form a wall in front of yourself." + new /obj/effect/forcefield/mime(locate(usr.x,usr.y,usr.z)) + return + +///////////Mimewalls/////////// + +/obj/effect/forcefield/mime + icon_state = "empty" + name = "invisible wall" + desc = "You have a bad feeling about this." + var/timeleft = 300 + var/last_process = 0 + +/obj/effect/forcefield/mime/New() + ..() + last_process = world.time + processing_objects.Add(src) + +/obj/effect/forcefield/mime/process() + timeleft -= (world.time - last_process) + if(timeleft <= 0) + processing_objects.Remove(src) + qdel(src) + +/////////////////////////////// + +/client/proc/mimespeak() + set category = "Mime" + set name = "Speech" + set desc = "Toggle your speech." + if(!ishuman(usr)) + return + + var/mob/living/carbon/human/H = usr + + if(H.miming) + H.miming = 0 + else + H << "You'll have to wait if you want to atone for your sins." + spawn(3000) + H.miming = 1 + return \ No newline at end of file diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 55ac30cd5d..ab92b6a3d3 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -385,7 +385,7 @@ if(!AN && !open && !infected & !imp) AN = "None:" - if(!e.is_stump()) + if(!(e.status & ORGAN_DESTROYED)) dat += "[e.name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]" else dat += "[e.name]--Not [e.is_stump() ? "Found" : "Attached Completely"]" diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 3eee7615b3..b9b6635a14 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -449,7 +449,7 @@ var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") + src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]") if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 8747f7750c..eba129df26 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -391,7 +391,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") + active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]") if ("Delete Record (ALL)") if (active1) diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm index 4425dc236a..a9bc390791 100644 --- a/code/game/machinery/computer3/computers/medical.dm +++ b/code/game/machinery/computer3/computers/medical.dm @@ -461,7 +461,7 @@ var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") + src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]") if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index 0c58ea6728..1ba0c08cf7 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -410,7 +410,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") + active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]") if ("Delete Record (ALL)") if (active1) diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm index efd0747b35..2ffa495b70 100644 --- a/code/game/machinery/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -29,14 +29,16 @@ /obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) - var/obj/item/weapon/card/id/I = W.GetID() - - if(vendmode == 1 && I) - scan_id(I, W) - vendmode = 0 - if(vendmode == 3 && I) - if(reimburse_id(I, W)) + if(vendmode == 1) + if(istype(W, /obj/item/weapon/card)) + var/obj/item/weapon/card/I = W + scan_card(I) vendmode = 0 + if(vendmode == 3) + if(istype(W,/obj/item/weapon/card)) + var/obj/item/weapon/card/I = W + if(reimburse(I)) + vendmode = 0 if(vendmode == 0) if(istype(W, /obj/item/device/laptop)) var/obj/item/device/laptop/L = W @@ -199,24 +201,26 @@ newlap.spawn_parts() -/obj/machinery/lapvend/proc/scan_id(var/obj/item/weapon/card/id/C, var/obj/item/I) - visible_message("\The [usr] swipes \the [I] through \the [src].") - var/datum/money_account/CH = get_account(C.associated_account_number) - if(!CH) - usr << "\icon[src]No valid account number is associated with this card." - return - if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - if(vendor_account) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - transfer_and_vend(D, C) +/obj/machinery/lapvend/proc/scan_card(var/obj/item/weapon/card/I) + if (istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/C = I + visible_message("[usr] swipes a card through [src].") + var/datum/money_account/CH = get_account(C.associated_account_number) + if(!CH) + usr << "\icon[src]No valid account number is associated with this card." + return + if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) + if(vendor_account) + var/attempt_pin = input("Enter pin code", "Vendor transaction") as num + var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) + if(D) + transfer_and_vend(D, C) + else + usr << "\icon[src]Unable to access account. Check security settings and try again." else usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support." else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." - else - transfer_and_vend(CH, C) + transfer_and_vend(CH, C) // Transfers money and vends the laptop. @@ -348,28 +352,30 @@ -/obj/machinery/lapvend/proc/reimburse_id(var/obj/item/weapon/card/id/C, var/obj/item/I) - visible_message("\The [usr] swipes \the [I] through \the [src].") - var/datum/money_account/CH = get_account(C.associated_account_number) - if(!CH) - usr << "\icon[src]No valid account number is associated with this card." - return 0 - if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - if(vendor_account) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - transfer_and_reimburse(D) - return 1 +/obj/machinery/lapvend/proc/reimburse(var/obj/item/weapon/card/I) + if (istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/C = I + visible_message("[usr] swipes a card through [src].") + var/datum/money_account/CH = get_account(C.associated_account_number) + if(!CH) + usr << "\icon[src]No valid account number is associated with this card." + return 0 + if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) + if(vendor_account) + var/attempt_pin = input("Enter pin code", "Vendor transaction") as num + var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) + if(D) + transfer_and_reimburse(D) + return 1 + else + usr << "\icon[src]Unable to access account. Check security settings and try again." + return 0 else usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support." return 0 else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." - return 0 - else - transfer_and_reimburse(CH) - return 1 + transfer_and_reimburse(CH) + return 1 /obj/machinery/lapvend/proc/transfer_and_reimburse(var/datum/money_account/D) var/transaction_amount = total() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 70dad044a2..77f6418ea9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -397,12 +397,12 @@ set_opacity(0) sleep(3) src.density = 0 - update_nearby_tiles() sleep(7) src.layer = open_layer explosion_resistance = 0 update_icon() set_opacity(0) + update_nearby_tiles() operating = 0 if(autoclose) @@ -424,12 +424,12 @@ src.density = 1 explosion_resistance = initial(explosion_resistance) src.layer = closed_layer - update_nearby_tiles() sleep(7) update_icon() if(visible && !glass) set_opacity(1) //caaaaarn! operating = 0 + update_nearby_tiles() //I shall not add a check every x ticks if a door has closed over some fire. var/obj/fire/fire = locate() in loc diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index efcc8314c1..bdc6b5ca44 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -88,7 +88,7 @@ //Processes the occupant, drawing from the internal power cell if needed. /obj/machinery/recharge_station/proc/process_occupant() - if(isrobot(occupant)) + if(istype(occupant, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = occupant if(R.module) @@ -103,11 +103,6 @@ R.adjustBruteLoss(-weld_rate) if(wire_rate && R.getFireLoss() && cell.checked_use(wire_power_use * wire_rate * CELLRATE)) R.adjustFireLoss(-wire_rate) - else if(ishuman(occupant)) - var/mob/living/carbon/human/H = occupant - if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450) - H.nutrition = min(H.nutrition+10, 450) - cell.use(7000/450*10) else if(istype(occupant, /mob/living/carbon/human)) @@ -124,6 +119,7 @@ H.nutrition = min(H.nutrition+10, 450) cell.use(7000/450*10) + /obj/machinery/recharge_station/examine(mob/user) ..(user) user << "The charge meter reads: [round(chargepercentage())]%" @@ -251,17 +247,6 @@ else return -/obj/machinery/recharge_station/proc/hascell(var/mob/M) - if(isrobot(M)) - var/mob/living/silicon/robot/R = M - if(R.cell) - return 1 - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!isnull(H.internal_organs_by_name["cell"])) - return 1 - return 0 - /obj/machinery/recharge_station/proc/go_out() if(!occupant) return @@ -288,6 +273,4 @@ set name = "Enter Recharger" set src in oview(1) - if(!usr.incapacitated()) - return go_in(usr) diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index 54faef41f8..3a2974008f 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -88,7 +88,7 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) G.fields["rank"] = "Unassigned" G.fields["real_rank"] = G.fields["rank"] G.fields["name"] = mname - G.fields["id"] = generate_record_id() + G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) M.fields["name"] = G.fields["name"] M.fields["id"] = G.fields["id"] S.fields["name"] = G.fields["name"] diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index b8171f59e0..19fd8b4725 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -815,12 +815,15 @@ dat += "
\[apply customisation routine\]


" if(panel_open) - wires.Interact(user) + dat += wires() user << browse(dat, "window=suit_cycler") onclose(user, "suit_cycler") return +/obj/machinery/suit_cycler/proc/wires() + return wires.GetInteractWindow() + /obj/machinery/suit_cycler/Topic(href, href_list) if(href_list["eject_suit"]) if(!suit) return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3c35ece9d2..a10a20920d 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -987,11 +987,6 @@ if (usr.stat || !ishuman(usr)) return - - if (usr.buckled) - usr << "You can't climb into the exosuit while buckled!" - return - src.log_message("[usr] tries to move in.") if(iscarbon(usr)) var/mob/living/carbon/C = usr diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 65fa2ceb6a..1252dc0b08 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -77,7 +77,7 @@ var/global/list/image/splatter_cache=list() var/obj/item/organ/external/l_foot = perp.get_organ("l_foot") var/obj/item/organ/external/r_foot = perp.get_organ("r_foot") var/hasfeet = 1 - if((!l_foot || l_foot.is_stump()) && (!r_foot || r_foot.is_stump())) + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) hasfeet = 0 if(perp.shoes && !perp.buckled)//Adding blood to shoes var/obj/item/clothing/shoes/S = perp.shoes diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index a07b82cd17..a7de8f9657 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -167,9 +167,6 @@ if(temp && !temp.is_usable()) user << "You try to move your [temp.name], but cannot!" return - if(!temp) - user << "You try to use your hand, but realize it is no longer attached!" - return src.pickup(user) if (istype(src.loc, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = src.loc @@ -260,9 +257,6 @@ // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(var/mob/user, var/slot) - layer = 20 - if(user.client) user.client.screen |= src - if(user.pulling == src) user.stop_pulling() return //Defines which slots correspond to which slot flags diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 1085dd3477..b5b8767409 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -18,12 +18,10 @@ /obj/item/device/chameleon/dropped() disrupt() - ..() /obj/item/device/chameleon/equipped() ..() disrupt() - ..() /obj/item/device/chameleon/attack_self() toggle() diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 2ea254febd..fa2a8d4864 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -322,7 +322,7 @@ qdel(src) /obj/item/device/paicard/see_emote(mob/living/M, text) - if(pai && pai.client && !pai.canmove) + if(pai && pai.client) var/rendered = "[text]" pai.show_message(rendered, 2) ..() diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 3ccf1fb3a9..afe50bc2b7 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -71,10 +71,6 @@ icon_state = "meson" icon = 'icons/obj/clothing/glasses.dmi' -/obj/item/borg/sight/material - name = "\proper material scanner vision" - sight_mode = BORGMATERIAL - /obj/item/borg/sight/hud name = "hud" var/obj/item/clothing/glasses/hud/hud = null diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 17e9d35ab9..39b2b20b0c 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -71,7 +71,7 @@ var/uses = 10 /obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user) - var/used_uses = A.emag_act(uses, user, src) + var/used_uses = A.emag_act(uses, user) if(used_uses < 0) return ..(A, user) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 0ccb1f1a24..92814eea6c 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -15,15 +15,7 @@ /* * Soap */ -/obj/item/weapon/soap/New() - ..() - create_reagents(5) - wet() - -/obj/item/weapon/soap/proc/wet() - reagents.add_reagent("cleaner", 5) - -/obj/item/weapon/soap/Crossed(AM as mob|obj) +/obj/item/weapon/soap/Crossed(AM as mob|obj) //EXACTLY the same as bananapeel for now, so it makes sense to put it in the same dm -- Urist if (istype(AM, /mob/living)) var/mob/living/M = AM M.slip("the [src.name]",3) @@ -40,10 +32,7 @@ else if(istype(target,/turf)) user << "You scrub \the [target.name] clean." var/turf/T = target - T.clean(src, user) - else if(istype(target,/obj/structure/sink)) - user << "You wet \the [src] in the sink." - wet() + T.clean(src) else user << "You clean \the [target.name]." target.clean_blood() diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index eadb5b0848..626034de00 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -164,7 +164,7 @@ playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1) for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to_obj(src, G.reagents.total_volume) + G.reagents.trans_to(src, G.reagents.total_volume) if(src.reagents.total_volume) //The possible reactions didnt use up all reagents. var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 783a2088da..0b5ed55d62 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -6,7 +6,6 @@ name = "implant" icon = 'icons/obj/device.dmi' icon_state = "implant" - w_class = 1 var/implanted = null var/mob/imp_in = null var/obj/item/organ/external/part = null diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm new file mode 100644 index 0000000000..e69de29bb2 diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index b5c966ebd5..0034ddb60b 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -38,20 +38,14 @@ if (reagents.total_volume > 0) reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) if(M == user) - if(!M.can_eat(loaded)) - return M.visible_message("\The [user] eats some [loaded] from \the [src].") else - user.visible_message("\The [user] begins to feed \the [M]!") - if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS))) - return M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].") playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) overlays.Cut() return else - user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK - return + ..() /obj/item/weapon/material/kitchen/utensil/fork name = "fork" @@ -96,14 +90,14 @@ /obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "You accidentally cut yourself with \the [src]." + user << "You accidentally cut yourself with the [src]." user.take_organ_damage(20) return return ..() /obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "You somehow managed to cut yourself with \the [src]." + user << "You somehow managed to cut yourself with the [src]." user.take_organ_damage(20) return return ..() @@ -126,7 +120,7 @@ /obj/item/weapon/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "\The [src] slips out of your hand and hits your head." + user << "The [src] slips out of your hand and hits your head." user.take_organ_damage(10) user.Paralyse(2) return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 3fbef18d3e..e0b8b66b2f 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -14,7 +14,19 @@ /obj/item/weapon/mop/New() - create_reagents(30) + create_reagents(5) + +//expects an atom containing the reagents used to clean the turf +/turf/proc/clean(atom/source) + if(source.reagents.has_reagent("water", 1)) + clean_blood() + if(istype(src, /turf/simulated)) + var/turf/simulated/T = src + T.dirt = 0 + for(var/obj/effect/O in src) + if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) + qdel(O) + source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. /obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity) if(!proximity) return @@ -28,7 +40,7 @@ if(do_after(user, 40)) var/turf/T = get_turf(A) if(T) - T.clean(src, user) + T.clean(src) user << "You have finished mopping!" diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 33d462eff2..f794e7a6a3 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -35,7 +35,7 @@ else user << "Access Denied" else if(istype(W, /obj/item/weapon/melee/energy/blade)) - if(emag_act(INFINITY, user, W, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying.")) + if(emag_act(INFINITY, user, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying.")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() @@ -55,7 +55,7 @@ ..() return -/obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") +/obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback = "", var/audible_feedback = "") if(!broken) if(visual_feedback) visual_feedback = "[visual_feedback]" diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 3950ea8909..73e3fb0108 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -33,7 +33,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(locked) - if (istype(W, /obj/item/weapon/melee/energy/blade) && emag_act(INFINITY, user, "You slice through the lock of \the [src]")) + if (emag_act(INFINITY, user, "You slice through the lock of \the [src]")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b9b7149196..d7d4c1f36c 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -165,18 +165,19 @@ if(1) for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion A.forceMove(src.loc) - A.ex_act(severity + 1) + A.ex_act(severity++) qdel(src) if(2) if(prob(50)) for (var/atom/movable/A as mob|obj in src) A.forceMove(src.loc) - A.ex_act(severity + 1) + A.ex_act(severity++) qdel(src) if(3) if(prob(5)) for(var/atom/movable/A as mob|obj in src) A.forceMove(src.loc) + A.ex_act(severity++) qdel(src) /obj/structure/closet/proc/damage(var/damage) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index d91b22fe74..8c49fc0d9f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -66,12 +66,11 @@ src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet user.drop_item() if (W) W.forceMove(src.loc) - else if(W.GetID()) - var/obj/item/weapon/card/id/I = W.GetID() - + else if(istype(W, /obj/item/weapon/card/id)) if(src.broken) user << "It appears to be broken." return + var/obj/item/weapon/card/id/I = W if(!I || !I.registered_name) return if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name))) //they can open all lockers, or nobody owns this, or they own this locker diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 395eb13df0..a553db51c6 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -90,7 +90,7 @@ else togglelock(user) -/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") +/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback, var/audible_feedback) if(!broken) broken = 1 locked = 0 @@ -100,11 +100,8 @@ if(visual_feedback) visible_message(visual_feedback, audible_feedback) - else if(user && emag_source) - visible_message("\The [src] has been broken by \the [user] with \an [emag_source]!", "You hear a faint electrical spark.") else - visible_message("\The [src] sparks and breaks open!", "You hear a faint electrical spark.") - return 1 + visible_message("The locker has been broken by [user] with an electromagnetic card!", "You hear a faint electrical spark.") /obj/structure/closet/secure_closet/attack_hand(mob/user as mob) src.add_fingerprint(user) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 64129a80f7..1d8686a678 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -135,7 +135,7 @@ return 1 if(is_full_window()) return 0 //full tile window, you can't move into it! - if(get_dir(loc, target) & dir) + if(get_dir(loc, target) == dir) return !density else return 1 @@ -187,8 +187,8 @@ playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) user.do_attack_animation(src) - usr.visible_message("\The [usr] bangs against \the [src]!", - "You bang against \the [src]!", + usr.visible_message("[usr.name] bangs against the [src.name]!", + "You bang against the [src.name]!", "You hear a banging sound.") else playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) @@ -295,7 +295,7 @@ if(usr.incapacitated()) return 0 - + if(anchored) usr << "It is fastened to the floor therefore you can't rotate it!" return 0 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8b8b1edeb8..3eb48aa0e7 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -217,20 +217,5 @@ var/const/enterloopsanity = 100 return 1 return 0 -//expects an atom containing the reagents used to clean the turf -/turf/proc/clean(atom/source, mob/user) - if(source.reagents.has_reagent("water", 1) || source.reagents.has_reagent("cleaner", 1)) - clean_blood() - if(istype(src, /turf/simulated)) - var/turf/simulated/T = src - T.dirt = 0 - for(var/obj/effect/O in src) - if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - qdel(O) - else - user << "\The [source] is too dry to wash that." - source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. - /turf/proc/update_blood_overlays() return - diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index f2a2d74f11..9d40b49bcf 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -108,7 +108,7 @@ log_ooc("(LOCAL) [mob.name]/[key] : [msg]") var/mob/source = mob.get_looc_source() - var/list/heard = get_mobs_or_objects_in_view(7, get_turf(source), 1, 0) + var/list/heard = get_mobs_or_objects_in_view(7, source, 1, 0) var/display_name = key if(holder && holder.fakekey) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index bed720d584..cad22a9e27 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -31,7 +31,6 @@ if(held_item) var/damagetype = held_item.suicide_act(src) if(damagetype) - log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]") var/damage_mod = 1 switch(damagetype) //Sorry about the magic numbers. //brute = 1, burn = 2, tox = 4, oxy = 8 @@ -71,7 +70,7 @@ updatehealth() return - log_and_message_admins("[key_name(src)] commited suicide") + viewers(src) << pick("[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ "[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ "[src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 108fd45f27..646845aa89 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1315,7 +1315,7 @@ proc/admin_notice(var/message, var/rights) if (!istype(src,/datum/admins)) src = usr.client.holder - if (!istype(src,/datum/admins) || !check_rights(R_ADMIN)) + if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return @@ -1323,31 +1323,17 @@ proc/admin_notice(var/message, var/rights) usr << "Mode has not started." return - log_and_message_admins("attempting to force mode autospawn.") + message_admins("[key_name(usr)] attempting to force mode latespawn.") + ticker.mode.next_spawn = 0 ticker.mode.try_latespawn() - -/datum/admins/proc/paralyze_mob(mob/living/H as mob) - set category = "Admin" - set name = "Toggle Paralyze" - set desc = "Paralyzes a player. Or unparalyses them." - - var/msg - - if(check_rights(R_ADMIN)) - if (H.paralysis == 0) - H.paralysis = 8000 - msg = "has paralyzed [key_name(H)]." - else - H.paralysis = 0 - msg = "has unparalyzed [key_name(H)]." - log_and_message_admins(msg) + /datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob) set category = "Debug" set name = "Set Telecrystals" set desc = "Allows admins to change telecrystals of a user." - + var/crystals - + if(check_rights(R_ADMIN)) crystals = input("Amount of telecrystals for [H.ckey]", crystals) as null|num if (!isnull(crystals)) @@ -1356,4 +1342,19 @@ proc/admin_notice(var/message, var/rights) message_admins(msg) else usr << "You do not have access to this command." - + +/datum/admins/proc/paralyze_mob(mob/living/H as mob) + set category = "Admin" + set name = "Toggle Paralyze" + set desc = "Paralyzes a player. Or unparalyses them." + + var/msg + + if(check_rights(R_ADMIN|R_MOD)) + if (H.paralysis == 0) + H.paralysis = 8000 + msg = "[key_name(usr)] has paralyzed [key_name(H)]." + else + H.paralysis = 0 + msg = "[key_name(usr)] has unparalyzed [key_name(H)]." + message_admins(msg) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4358d2f1cb..401dfa195c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -132,6 +132,9 @@ var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_atom, /*allows us to spawn instances*/ /client/proc/respawn_character, + /client/proc/FireLaser, + /client/proc/FireCannons, + /client/proc/ChangeIcarusPosition, /client/proc/virus2_editor, /client/proc/spawn_chemdisp_cartridge ) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 40f10e3f44..2aa54f9a90 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1681,8 +1681,13 @@ else var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") if(choice=="Confirm") - news_network.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1) - feedback_inc("newscaster_channels",1) //Adding channel to the global network + var/datum/feed_channel/newChannel = new /datum/feed_channel + newChannel.channel_name = src.admincaster_feed_channel.channel_name + newChannel.author = src.admincaster_signature + newChannel.locked = src.admincaster_feed_channel.locked + newChannel.is_admin_channel = 1 + feedback_inc("newscaster_channels",1) + news_network.network_channels += newChannel //Adding channel to the global network log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!") src.admincaster_screen=5 src.access_news_network() diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 0ecc220ae2..2131e977ac 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -296,4 +296,3 @@ if(pa.Find("right")) if(holder.throw_atom) holder.throw_atom.throw_at(object, 10, 1) - log_admin("[key_name(usr)] threw [holder.throw_atom] at [object]") diff --git a/code/modules/admin/verbs/icarus.dm b/code/modules/admin/verbs/icarus.dm new file mode 100644 index 0000000000..6711c846fc --- /dev/null +++ b/code/modules/admin/verbs/icarus.dm @@ -0,0 +1,129 @@ +/client/proc/FireLaser() + set name = "Fire the Icarus lasers" + set desc = "Fires a laser bolt at your position. You should only do this as a(n) (a)ghost" + set category = "Fun" + + var/turf/target = get_turf(src.mob) + log_and_message_admins("has fired the Icarus point defense laser at [target.x]-[target.y]-[target.z]") + if(!src.holder) + src << "Only administrators may use this command." + return + + Icarus_FireLaser(target) + + +/client/proc/FireCannons() + set name = "Fire the Icarus cannons" + set desc = "Fires an explosive missile at your position. You should only do this as a(n) (a)ghost." + set category = "Fun" + + var/turf/target = get_turf(src.mob) + log_and_message_admins("has fired the Icarus main gun projectile at [target.x]-[target.y]-[target.z]") + if(!src.holder) + src << "Only administrators may use this command." + return + + Icarus_FireCannon(target) + + +/client/proc/ChangeIcarusPosition() + set name = "Adjust Icarus Position" + set desc = "Lets you chose the position of the Icarus in regards to the map." + set category = "Fun" + + log_and_message_admins("is changing the Icarus position.") + if(!src.holder) + src << "Only administrators may use this command." + return + + Icarus_SetPosition(src) + +var/icarus_position = SOUTH + +proc/Icarus_FireLaser(var/turf/target) + // Find the world edge to fire from. + var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x + var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y + var/x_off = x != target.x ? abs(target.x - x) : INFINITY + var/y_off = y != target.y ? abs(target.y - y) : INFINITY + // Get the minimum number of steps using the rise/run shit. + var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing. + + // Now we can get the location of the start. + x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0) + y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0) + + var/turf/start = locate(x, y, target.z) + + // should step down as: + // 1000, 500, 333, 250, 200, 167, 142, 125, 111, 100, 90 + var/damage = 1000 + for(var/i in 2 to 12) + var/obj/item/projectile/beam/in_chamber = new (start) + in_chamber.original = target + in_chamber.starting = start + in_chamber.silenced = 1 + in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0 + in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0 + in_chamber.damage = damage + in_chamber.kill_count = 500 + in_chamber.process() + damage -= damage / i + sleep(-1) + + // Let everyone know what hit them. + var/obj/item/projectile/beam/in_chamber = new (start) + in_chamber.original = target + in_chamber.starting = start + in_chamber.silenced = 0 + in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0 + in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0 + in_chamber.kill_count = 500 + in_chamber.damage = 0 + in_chamber.name = "point defense laser" + in_chamber.firer = "Icarus" // Never displayed, but we want this to display the hit message. + in_chamber.process() + +proc/Icarus_FireCannon(var/turf/target) + // Find the world edge to fire from. + var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x + var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y + var/x_off = x != target.x ? abs(target.x - x) : INFINITY + var/y_off = y != target.y ? abs(target.y - y) : INFINITY + // Get the minimum number of steps using the rise/run shit. + var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing. + + // Now we can get the location of the start. + x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0) + y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0) + + var/turf/start = locate(x, y, target.z) + + // Now we find the corresponding turf on the other side of the level. + // Yeah, yeah. Overuse of the terinary operator. So sue me. + x = icarus_position & EAST ? 1 : icarus_position & WEST ? world.maxx : target.x + y = icarus_position & NORTH ? 1 : icarus_position & SOUTH ? world.maxy : target.y + x_off = x != target.x ? abs(target.x - x) : INFINITY + y_off = y != target.y ? abs(target.y - y) : INFINITY + iterations = round(min(x_off, y_off)) + x = target.x + (icarus_position & EAST ? -iterations : icarus_position & WEST ? iterations : 0) + y = target.y + (icarus_position & NORTH ? -iterations : icarus_position & SOUTH ? iterations : 0) + target = locate(x, y, target.z) + + // Finally fire the fucker. + var/obj/effect/meteor/projectile = new (start) + projectile.dest = target + projectile.name = "main gun projectile" // stealthy + projectile.hits = 6 + + // Make sure it travels + spawn(0) + walk_towards(projectile, projectile.dest, 1) + +proc/Icarus_SetPosition(var/user) + var/global/list/directions = list("North" = 1, "North East" = 5, "East" = 4, "South East" = 6, "South" = 2, "South West" = 10, "West" = 8, "North West" = 9) + var/direction = input(user, "Where should the Icarus fire from?", "Icarus Comms") as null|anything in directions + if(!direction) + return + + icarus_position = directions[direction] diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index c1cde11dad..9c326e5965 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -520,8 +520,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(! (C.stat & (BROKEN|NOPOWER) ) ) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) P.name = "'[command_name()] Update.'" - P.info = replacetext(input, "\n", "
") - P.update_space(P.info) + P.info = input P.update_icon() C.messagetitle.Add("[command_name()] Update") C.messagetext.Add(P.info) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 0d34aa7659..d3f71325eb 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -158,7 +158,6 @@ spawn(5) // And wait a half-second, since it sounds like you can do this too fast. if(src) winset(src, null, "command=\".configure graphics-hwmode off\"") - sleep(2) // wait a bit more, possibly fixes hardware mode not re-activating right winset(src, null, "command=\".configure graphics-hwmode on\"") log_client_to_db() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 73531b82e2..11d21f6fe0 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -368,4 +368,4 @@ datum/preferences user << browse(dat, "window=saves;size=300x390") /datum/preferences/proc/close_load_dialog(mob/user) - user << browse(null, "window=saves") \ No newline at end of file + user << browse(null, "window=saves") diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm index e60cdb75b9..eeaf5b9d56 100644 --- a/code/modules/client/preferences_factions.dm +++ b/code/modules/client/preferences_factions.dm @@ -25,7 +25,7 @@ var/global/list/home_system_choices = list( "Vir", "Nyx", "Tau Ceti", - "Epsilon Ursae Minoris", + "Epsilon Ursae Majoris", "S'randarr" ) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index d80504f665..ca0c5a99ed 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -18,17 +18,7 @@ var/global/list/gear_datums = list() //create a list of gear datums to sort for(var/type in typesof(/datum/gear)-/datum/gear) - var/datum/gear/G = type - if(!initial(G.display_name)) - error("Loadout - Missing display name: [G]") - continue - if(!initial(G.cost)) - error("Loadout - Missing cost: [G]") - continue - if(!initial(G.path)) - error("Loadout - Missing path definition: [G]") - continue - G = new G() + var/datum/gear/G = new type() var/category = (G.sort_category in sort_categories)? G.sort_category : "unknown" sort_categories[category][G.display_name] = G @@ -220,7 +210,7 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head -/datum/gear/bowler + /datum/gear/bowler display_name = "hat, bowler" path = /obj/item/clothing/head/bowler cost = 1 @@ -601,7 +591,7 @@ var/global/list/gear_datums = list() cost = 1 allowed_roles = list("Quartermaster","Cargo Technician") -/datum/gear/pants +/datum/gear/white display_name = "pants, white" path = /obj/item/clothing/under/pants/white slot = slot_w_uniform @@ -651,55 +641,55 @@ var/global/list/gear_datums = list() display_name = "pants, young folks jeans" path = /obj/item/clothing/under/pants/youngfolksjeans -/datum/gear/jeans +/datum/gear/shorts/jeans display_name = "shorts, jeans" path = /obj/item/clothing/under/shorts/jeans slot = slot_w_uniform cost = 1 -/datum/gear/jeans/classic +/datum/gear/shorts/jeans/classic display_name = "shorts, classic jeans" path = /obj/item/clothing/under/shorts/jeans/classic -/datum/gear/jeans/mustang +/datum/gear/shorts/jeans/mustang display_name = "shorts, mustang jeans" path = /obj/item/clothing/under/shorts/jeans/mustang -/datum/gear/jeans/youngfolks +/datum/gear/shorts/jeans/youngfolks display_name = "shorts, young folks jeans" path = /obj/item/clothing/under/shorts/jeans/youngfolks -/datum/gear/jeans/black +/datum/gear/shorts/jeans/black display_name = "shorts, black jeans" path = /obj/item/clothing/under/shorts/jeans/black -/datum/gear/jeans/female +/datum/gear/shorts/jeans/female display_name = "shorts, female, jeans" path = /obj/item/clothing/under/shorts/jeans/female -/datum/gear/jeans/classic/female +/datum/gear/shorts/jeans/classic/female display_name = "shorts, female, classic jeans" path = /obj/item/clothing/under/shorts/jeans/classic/female -/datum/gear/jeans/mustang/female +/datum/gear/shorts/jeans/mustang/female display_name = "shorts, female, mustang jeans" path = /obj/item/clothing/under/shorts/jeans/mustang/female -/datum/gear/jeans/youngfolks/female +/datum/gear/shorts/jeans/youngfolks/female display_name = "shorts, female, young folks jeans" path = /obj/item/clothing/under/shorts/jeans/youngfolks/female -/datum/gear/jeans/black/female +/datum/gear/shorts/jeans/black/female display_name = "shorts, female, black jeans" path = /obj/item/clothing/under/shorts/jeans/black/female -/datum/gear/khaki +/datum/gear/shorts/khaki display_name = "shorts, khaki" path = /obj/item/clothing/under/shorts/khaki slot = slot_w_uniform cost = 1 -/datum/gear/khaki/female +/datum/gear/shorts/khaki/female display_name = "shorts, female, khaki" path = /obj/item/clothing/under/shorts/khaki/female @@ -1258,7 +1248,7 @@ var/global/list/gear_datums = list() slot = slot_wear_suit whitelisted = "Tajara" // You do have a monopoly on a fur suit tho -/datum/gear/forensics +/datum/gear/forensics/red display_name = "forensics long, red" path = /obj/item/clothing/suit/storage/forensics/red/long cost = 2 @@ -1662,11 +1652,11 @@ var/global/list/gear_datums = list() display_name = "skrell headtail-wear, male, blue, cloth" path = /obj/item/clothing/ears/skrell/cloth_male/blue -/datum/gear/skrell_cloth/male/green +/datum/gear/skrell_cloth_male/green display_name = "skrell headtail-wear, male, green, cloth" path = /obj/item/clothing/ears/skrell/cloth_male/green -/datum/gear/skrell_cloth/male/pink +/datum/gear/skrell_cloth_male/pink display_name = "skrell headtail-wear, male, pink, cloth" path = /obj/item/clothing/ears/skrell/cloth_male/pink @@ -1674,18 +1664,18 @@ var/global/list/gear_datums = list() display_name = "skrell headtail-wear, female, red, cloth" path = /obj/item/clothing/ears/skrell/cloth_female -/datum/gear/skrell_cloth/female/black +/datum/gear/skrell_cloth_female/black display_name = "skrell headtail-wear, female, black, cloth" path = /obj/item/clothing/ears/skrell/cloth_female/black -/datum/gear/skrell_cloth/female/blue +/datum/gear/skrell_cloth_female/blue display_name = "skrell headtail-wear, female, blue, cloth" path = /obj/item/clothing/ears/skrell/cloth_female/blue -/datum/gear/skrell_cloth/female/green +/datum/gear/skrell_cloth_female/green display_name = "skrell headtail-wear, female, green, cloth" path = /obj/item/clothing/ears/skrell/cloth_female/green -/datum/gear/skrell_cloth/female/pink +/datum/gear/skrell_cloth_female/pink display_name = "skrell headtail-wear, female, pink, cloth" path = /obj/item/clothing/ears/skrell/cloth_female/pink diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d3fad955d6..11e5857cba 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -90,4 +90,4 @@ return 1 #undef SAVEFILE_VERSION_MAX -#undef SAVEFILE_VERSION_MIN \ No newline at end of file +#undef SAVEFILE_VERSION_MIN diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 0171c11746..2ae77c7a69 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -38,7 +38,6 @@ interface_desc = "A self-sustaining plasma arc capable of cutting through walls." suit_overlay_active = "plasmacutter" suit_overlay_inactive = "plasmacutter" - use_power_cost = 0.5 device_type = /obj/item/weapon/pickaxe/plasmacutter @@ -59,7 +58,6 @@ interface_desc = "A diamond-tipped industrial drill." suit_overlay_active = "mounted-drill" suit_overlay_inactive = "mounted-drill" - use_power_cost = 0.1 device_type = /obj/item/weapon/pickaxe/diamonddrill diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index 8b13a57c8d..8dc13b083e 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -1,6 +1,6 @@ /obj/item/clothing/head/helmet/space/rig/ert light_overlay = "helmet_light_dual" - camera_networks = list(NETWORK_ERT) + camera_networks = list("ERT") /obj/item/weapon/rig/ert name = "ERT-C hardsuit control module" diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index bc5c15fbb0..cf941f678e 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -40,7 +40,7 @@ airtight = 0 seal_delay = 5 //not being vaccum-proof has an upside I guess - + helm_type = /obj/item/clothing/head/lightrig/hacker chest_type = /obj/item/clothing/suit/lightrig/hacker glove_type = /obj/item/clothing/gloves/lightrig/hacker diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 350d2aea4a..d627f3ccdb 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -1,23 +1,23 @@ /obj/item/clothing/head/helmet/space/rig/industrial - camera_networks = list(NETWORK_MINE) + camera_networks = list("Mine") /obj/item/clothing/head/helmet/space/rig/ce - camera_networks = list(NETWORK_ENGINEERING) + camera_networks = list("Engineering") /obj/item/clothing/head/helmet/space/rig/eva light_overlay = "helmet_light_dual" - camera_networks = list(NETWORK_ENGINEERING) + camera_networks = list("Engineering") /obj/item/clothing/head/helmet/space/rig/hazmat light_overlay = "hardhat_light" - camera_networks = list(NETWORK_RESEARCH) + camera_networks = list("Research") /obj/item/clothing/head/helmet/space/rig/medical - camera_networks = list(NETWORK_MEDICAL) + camera_networks = list("Medbay") /obj/item/clothing/head/helmet/space/rig/hazard light_overlay = "helmet_light_dual" - camera_networks = list(NETWORK_SECURITY) + camera_networks = list("Security") /obj/item/weapon/rig/internalaffairs name = "augmented tie" diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 160dec82f4..17a4d36569 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -39,7 +39,6 @@ return name = "[seed.seed_name]" - trash = seed.get_trash_type() update_icon() diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 0dc46f9e35..f898e3b8ea 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -69,9 +69,6 @@ /datum/seed/proc/get_trait(var/trait) return traits["[trait]"] -/datum/seed/proc/get_trash_type() - return trash_type - /datum/seed/proc/set_trait(var/trait,var/nval,var/ubound,var/lbound, var/degrade) if(!isnull(degrade)) nval *= degrade if(!isnull(ubound)) nval = min(nval,ubound) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 329ed98227..7dca31d977 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -124,7 +124,7 @@ ) /obj/machinery/portable_atmospherics/hydroponics/AltClick() - if(mechanical && !usr.incapacitated() && Adjacent(usr)) + if(mechanical && !usr.stat && !usr.lying && Adjacent(usr)) close_lid(usr) return 1 return ..() @@ -357,15 +357,12 @@ set category = "Object" set src in view(1) - if(usr.incapacitated()) - return - if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) - if(labelled) - usr << "You remove the label." - labelled = null - update_icon() - else - usr << "There is no label to remove." + if(labelled) + usr << "You remove the label." + labelled = null + update_icon() + else + usr << "There is no label to remove." return /obj/machinery/portable_atmospherics/hydroponics/verb/setlight() @@ -373,14 +370,10 @@ set category = "Object" set src in view(1) - if(usr.incapacitated()) - return - if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) - var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) - if(new_light) - tray_light = new_light - usr << "You set the tray to a light level of [tray_light] lumens." - return + var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) + if(new_light) + tray_light = new_light + usr << "You set the tray to a light level of [tray_light] lumens." /obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity() //Make sure various values are sane. @@ -621,14 +614,12 @@ set name = "Toggle Tray Lid" set category = "Object" set src in view(1) - if(usr.incapacitated()) - return - - if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) - close_lid(usr) - return + close_lid(usr) /obj/machinery/portable_atmospherics/hydroponics/proc/close_lid(var/mob/living/user) + if(!user || user.stat || user.restrained()) + return + closed_system = !closed_system user << "You [closed_system ? "close" : "open"] the tray's lid." update_icon() diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 18c96cf622..93e2c88d42 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -11,7 +11,7 @@ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]") - if(integrity>=50) + if(integrity>=100) recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 490513431b..8a919c98a5 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -571,7 +571,7 @@ var/list/name_to_material name = "wood" stack_type = /obj/item/stack/material/wood icon_colour = "#824B28" - integrity = 50 + integrity = 25 icon_base = "solid" explosion_resistance = 2 shard_type = SHARD_SPLINTER diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 714b001f69..5d3915c7fd 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -151,8 +151,6 @@ 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) - ghost.client.time_died_as_mouse = ghost.timeofdeath if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 340546002f..9908a6378f 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -2,8 +2,9 @@ //m_type == 1 --> visual. //m_type == 2 --> audible /mob/proc/custom_emote(var/m_type=1,var/message = null) + if(stat || !use_me && usr == src) - src << "You are unable to emote." + usr << "You are unable to emote." return var/muzzled = is_muzzled() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 77eedec900..e4472e2450 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -103,34 +103,64 @@ var/list/slot_equipment_priority = list( \ //Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_l_hand(var/obj/item/W) - if(lying || !istype(W)) - return 0 - return 1 + if(lying) return 0 + if(!istype(W)) return 0 + if(!l_hand) + W.forceMove(src) //TODO: move to equipped? + l_hand = W + W.layer = 20 //TODO: move to equipped? +// l_hand.screen_loc = ui_lhand + W.equipped(src,slot_l_hand) + if(client) client.screen |= W + if(pulling == W) stop_pulling() + update_inv_l_hand() + return 1 + return 0 //Puts the item into your r_hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_r_hand(var/obj/item/W) - if(lying || !istype(W)) - return 0 - return 1 + if(lying) return 0 + if(!istype(W)) return 0 + if(!r_hand) + W.forceMove(src) + r_hand = W + W.layer = 20 +// r_hand.screen_loc = ui_rhand + W.equipped(src,slot_r_hand) + if(client) client.screen |= W + if(pulling == W) stop_pulling() + update_inv_r_hand() + return 1 + return 0 //Puts the item into our active hand if possible. returns 1 on success. /mob/proc/put_in_active_hand(var/obj/item/W) - return 0 // Moved to human procs because only they need to use hands. + if(hand) return put_in_l_hand(W) + else return put_in_r_hand(W) //Puts the item into our inactive hand if possible. returns 1 on success. /mob/proc/put_in_inactive_hand(var/obj/item/W) - return 0 // As above. + if(hand) return put_in_r_hand(W) + else return put_in_l_hand(W) //Puts the item our active hand if possible. Failing that it tries our inactive hand. Returns 1 on success. //If both fail it drops it on the floor and returns 0. //This is probably the main one you need to know :) /mob/proc/put_in_hands(var/obj/item/W) - if(!W) + if(!W) return 0 + if(put_in_active_hand(W)) + update_inv_l_hand() + update_inv_r_hand() + return 1 + else if(put_in_inactive_hand(W)) + update_inv_l_hand() + update_inv_r_hand() + return 1 + else + W.forceMove(get_turf(src)) + W.layer = initial(W.layer) + W.dropped() return 0 - W.forceMove(get_turf(src)) - W.layer = initial(W.layer) - W.dropped() - return 0 // Removes an item from inventory and places it in the target atom. // If canremove or other conditions need to be checked then use unEquip instead. diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 30b1c0a47b..5d3f7e487c 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -26,8 +26,6 @@ var/blood = 1 var/list/target_types = list() - var/maximum_search_range = 7 - /mob/living/bot/cleanbot/New() ..() get_targets() @@ -38,25 +36,6 @@ if(radio_controller) radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS) -/mob/living/bot/cleanbot/proc/handle_target() - if(loc == target.loc) - if(!cleaning) - UnarmedAttack(target) - return 1 - if(!path.len) -// spawn(0) - path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) - if(!path) - custom_emote(2, "[src] can't reach the target and is giving up.") - target = null - path = list() - return - if(path.len) - step_to(src, path[1]) - path -= path[1] - return 1 - return - /mob/living/bot/cleanbot/Life() ..() @@ -67,7 +46,7 @@ return if(cleaning) return - + if(!screwloose && !oddbutton && prob(5)) custom_emote(2, "makes an excited beeping booping sound!") @@ -83,64 +62,65 @@ spawn(600) ignorelist -= gib - // Find a target - - if(pulledby) // Don't wiggle if someone pulls you - patrol_path = list() - return + if(!target) // Find a target + for(var/obj/effect/decal/cleanable/D in view(7, src)) + if(D in ignorelist) + continue + for(var/T in target_types) + if(istype(D, T)) + target = D + patrol_path = list() - var/found_spot - search_loop: - for(var/i=0, i <= maximum_search_range, i++) - for(var/obj/effect/decal/cleanable/D in view(i, src)) - if(D in ignorelist) - continue - for(var/T in target_types) - if(istype(D, T)) - patrol_path = list() - target = D - found_spot = handle_target() - if (found_spot) - break search_loop - else - target = null - continue // no need to check the other types - - - if(!found_spot && !target) // No targets in range - if(!patrol_path || !patrol_path.len) - if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet - var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) - if(!frequency) - return - - closest_dist = 9999 - next_dest = null - next_dest_loc = null - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data = list("findbeakon" = "patrol") - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - signal_sent = world.time - else - if(next_dest) - next_dest_loc = listener.memorized[next_dest] - if(next_dest_loc) - patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) - signal_sent = 0 - else - if(pulledby) // Don't wiggle if someone pulls you - patrol_path = list() + if(!target) // No targets in range + if(!should_patrol) return - if(patrol_path[1] == loc) - patrol_path -= patrol_path[1] - var/moved = step_towards(src, patrol_path[1]) - if(moved) - patrol_path -= patrol_path[1] + if(!patrol_path || !patrol_path.len) + if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet + var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) + if(!frequency) + return + closest_dist = 9999 + next_dest = null + next_dest_loc = null + + var/datum/signal/signal = new() + signal.source = src + signal.transmission_method = 1 + signal.data = list("findbeakon" = "patrol") + frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) + signal_sent = world.time + else + if(next_dest) + next_dest_loc = listener.memorized[next_dest] + if(next_dest_loc) + patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) + signal_sent = 0 + else + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() + return + if(patrol_path[1] == loc) + patrol_path -= patrol_path[1] + var/moved = step_towards(src, patrol_path[1]) + if(moved) + patrol_path -= patrol_path[1] + if(target) + if(loc == target.loc) + if(!cleaning) + UnarmedAttack(target) + return + if(!path.len) + spawn(0) + path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + path = list() + return + if(path.len) + step_to(src, path[1]) + path -= path[1] + return /mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) if(!..()) @@ -153,7 +133,7 @@ return cleaning = 1 - custom_emote(2, "begins to clean up \the [D]") + custom_emote(2, "begins to clean up the [D]") update_icons() var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 if(do_after(src, cleantime)) @@ -163,8 +143,6 @@ if(!D) return qdel(D) - if(D == target) - target = null cleaning = 0 update_icons() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1b09c1b1e1..577ccdc9d8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -185,7 +185,7 @@ if(40 to INFINITY) status += "peeling away" - if(org.is_stump()) + if(org.status & ORGAN_DESTROYED) status += "MISSING" if(org.status & ORGAN_MUTATED) status += "weirdly shapen" diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 5c4be494ee..579321a512 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,42 +1,53 @@ -/mob/living/carbon/human/verb/give(var/mob/living/target in view(1)-usr) +mob/living/carbon/verb/give(var/mob/living/carbon/target in view(1)-usr) set category = "IC" set name = "Give" - - // TODO : Change to incapacitated() on merge. - if(usr.stat || usr.lying || usr.resting || usr.buckled) + if(!istype(target) || target.stat == 2 || usr.stat == 2|| target.client == null) return - if(!istype(target) || target.stat || target.lying || target.resting || target.buckled || target.client == null) + var/obj/item/I + if(!usr.hand && usr.r_hand == null) + usr << "You don't have anything in your right hand to give to [target.name]" return - - var/obj/item/I = usr.get_active_hand() + if(usr.hand && usr.l_hand == null) + usr << "You don't have anything in your left hand to give to [target.name]" + return + if(usr.hand) + I = usr.l_hand + else if(!usr.hand) + I = usr.r_hand if(!I) - I = usr.get_inactive_hand() - if(!I) - usr << "You don't have anything in your hands to give to \the [target]." return - - if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No") - target.visible_message("\The [usr] tried to hand \the [I] to \the [target], \ - but \the [target] didn't want it.") - return - - if(!I) return - - if(!Adjacent(target)) - usr << "You need to stay in reaching distance while giving an object." - target << "\The [usr] moved too far away." - return - - if(I.loc != usr || (usr.l_hand != I && usr.r_hand != I)) - usr << "You need to keep the item in your hands." - target << "\The [usr] seems to have given up on passing \the [I] to you." - return - - if(target.r_hand != null && target.l_hand != null) - target << "Your hands are full." - usr << "Their hands are full." - return - - if(usr.unEquip(I)) - target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. - target.visible_message("\The [usr] handed \the [I] to \the [target].") + if(target.r_hand == null || target.l_hand == null) + switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No")) + if("Yes") + if(!I) + return + if(!Adjacent(usr)) + usr << "You need to stay in reaching distance while giving an object." + target << "[usr.name] moved too far away." + return + if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) + usr << "You need to keep the item in your active hand." + target << "[usr.name] seem to have given up on giving \the [I.name] to you." + return + if(target.r_hand != null && target.l_hand != null) + target << "Your hands are full." + usr << "Their hands are full." + return + else + usr.drop_item() + if(target.r_hand == null) + target.r_hand = I + else + target.l_hand = I + I.loc = target + I.layer = 20 + I.add_fingerprint(target) + target.update_inv_l_hand() + target.update_inv_r_hand() + usr.update_inv_l_hand() + usr.update_inv_r_hand() + target.visible_message("[usr.name] handed \the [I.name] to [target.name].") + if("No") + target.visible_message("[usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") + else + usr << "[target.name]'s hands are full." diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f22aecce45..9b4670bb21 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -251,12 +251,14 @@ msg += "[T.He] [T.is] [ssd_msg].\n" var/list/wound_flavor_text = list() + var/list/is_destroyed = list() var/list/is_bleeding = list() for(var/organ_tag in species.has_limbs) var/list/organ_data = species.has_limbs[organ_tag] var/organ_descriptor = organ_data["descriptor"] + is_destroyed["organ_descriptor"] = 1 var/obj/item/organ/external/E = organs_by_name[organ_tag] if(!E) @@ -264,11 +266,13 @@ else if(E.is_stump()) wound_flavor_text["[organ_descriptor]"] = "[T.He] [T.has] a stump where [T.his] [organ_descriptor] should be.\n" else + is_destroyed["organ_descriptor"] = 0 continue for(var/obj/item/organ/external/temp in organs) if(temp) if(temp.status & ORGAN_DESTROYED) + is_destroyed["[temp.name]"] = 1 wound_flavor_text["[temp.name]"] = "[T.He] [T.is] missing [T.his] [temp.name].\n" continue if(!is_synth && temp.status & ORGAN_ROBOT) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f7f1ba7486..b6f31966e3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -305,7 +305,7 @@ //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable /mob/living/carbon/human/proc/get_face_name() var/obj/item/organ/external/head = get_organ(BP_HEAD) - if(!head || head.disfigured || head.is_stump() || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible + if(!head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible return "Unknown" return real_name @@ -1357,55 +1357,6 @@ return 1 return 0 -/mob/living/carbon/human/MouseDrop(var/atom/over_object) - var/mob/living/carbon/human/H = over_object - if(holder_type && a_intent == I_HELP && istype(H) && H == usr && H.a_intent == I_HELP && !issmall(H) && Adjacent(H)) - get_scooped(H) - return - return ..() - -//Puts the item into our active hand if possible. returns 1 on success. -/mob/living/carbon/human/put_in_active_hand(var/obj/item/W) - return (hand ? put_in_l_hand(W) : put_in_r_hand(W)) - -//Puts the item into our inactive hand if possible. returns 1 on success. -/mob/living/carbon/human/put_in_inactive_hand(var/obj/item/W) - return (hand ? put_in_r_hand(W) : put_in_l_hand(W)) - -/mob/living/carbon/human/put_in_hands(var/obj/item/W) - if(!W) - return 0 - if(put_in_active_hand(W)) - update_inv_l_hand() - update_inv_r_hand() - return 1 - else if(put_in_inactive_hand(W)) - update_inv_l_hand() - update_inv_r_hand() - return 1 - else - return ..() - -/mob/living/carbon/human/put_in_l_hand(var/obj/item/W) - if(!..() || l_hand) - return 0 - W.forceMove(src) - l_hand = W - W.equipped(src,slot_l_hand) - W.add_fingerprint(src) - update_inv_l_hand() - return 1 - -/mob/living/carbon/human/put_in_r_hand(var/obj/item/W) - if(!..() || r_hand) - return 0 - W.forceMove(src) - r_hand = W - W.equipped(src,slot_r_hand) - W.add_fingerprint(src) - update_inv_r_hand() - return 1 - /mob/living/carbon/human/can_stand_overridden() if(wearing_rig && wearing_rig.ai_can_move_suit(check_for_ai = 1)) // Actually missing a leg will screw you up. Everything else can be compensated for. diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 3298cfcd8c..cea8035a84 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -138,7 +138,7 @@ var/hit_zone = H.zone_sel.selecting var/obj/item/organ/external/affecting = get_organ(hit_zone) - if(!affecting || affecting.is_stump()) + if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED)) M << "They are missing that limb!" return 1 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 01da722636..2e69c9bdb6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -143,12 +143,6 @@ emp_act for(var/obj/O in src) if(!O) continue O.emp_act(severity) - for(var/obj/item/organ/external/O in organs) - O.emp_act(severity) - for(var/obj/item/organ/I in O.internal_organs) - if(!(I.status & ORGAN_ROBOT)) - continue - I.emp_act(severity) ..() @@ -166,7 +160,7 @@ emp_act var/obj/item/organ/external/affecting = get_organ(target_zone) - if (!affecting || affecting.is_stump()) + if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump()) user << "They are missing that limb!" return 0 diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm deleted file mode 100644 index 437c9d06a5..0000000000 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ /dev/null @@ -1,37 +0,0 @@ -#define HUMAN_EATING_NO_ISSUE 0 -#define HUMAN_EATING_NO_MOUTH 1 -#define HUMAN_EATING_BLOCKED_MOUTH 2 - -/mob/living/carbon/human/can_eat(var/food, var/feedback = 1) - var/list/status = can_eat_status() - if(status[1] == HUMAN_EATING_NO_ISSUE) - return 1 - if(feedback) - if(status[1] == HUMAN_EATING_NO_MOUTH) - src << "Where do you intend to put \the [food]? You don't have a mouth!" - else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) - src << "\The [status[2]] is in the way!" - return 0 - -/mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1) - var/list/status = can_eat_status() - if(status[1] == HUMAN_EATING_NO_ISSUE) - return 1 - if(feedback) - if(status[1] == HUMAN_EATING_NO_MOUTH) - feeder << "Where do you intend to put \the [food]? \The [src] doesn't have a mouth!" - else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) - feeder << "\The [status[2]] is in the way!" - return 0 - -/mob/living/carbon/human/proc/can_eat_status() - if(!check_has_mouth()) - return list(HUMAN_EATING_NO_MOUTH) - var/obj/item/blocked = check_mouth_coverage() - if(blocked) - return list(HUMAN_EATING_BLOCKED_MOUTH, blocked) - return list(HUMAN_EATING_NO_ISSUE) - -#undef HUMAN_EATING_NO_ISSUE -#undef HUMAN_EATING_NO_MOUTH -#undef HUMAN_EATING_BLOCKED_MOUTH diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index ba3d29c33a..ca052edb85 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -28,7 +28,7 @@ if(istype(buckled, /obj/structure/bed/chair/wheelchair)) for(var/organ_name in list(BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM)) var/obj/item/organ/external/E = get_organ(organ_name) - if(!E || E.is_stump()) + if(!E || (E.status & ORGAN_DESTROYED)) tally += 4 if(E.status & ORGAN_SPLINTED) tally += 0.5 @@ -40,7 +40,7 @@ for(var/organ_name in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) var/obj/item/organ/external/E = get_organ(organ_name) - if(!E || E.is_stump()) + if(!E || (E.status & ORGAN_DESTROYED)) tally += 4 else if(E.status & ORGAN_SPLINTED) tally += 0.5 diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index e87fd83dd4..b3c8660a27 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -71,7 +71,7 @@ var/limb_pain for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot")) var/obj/item/organ/external/E = organs_by_name[limb_tag] - if(!E || (E.status & (ORGAN_MUTATED|ORGAN_DEAD)) || E.is_stump()) //should just be !E.is_usable() here but dislocation screws that up. + if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD))) stance_damage += 2 // let it fail even if just foot&leg else if (E.is_malfunctioning()) //malfunctioning only happens intermittently so treat it as a missing limb when it procs diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 42262b8c93..7e1057d9d9 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,7 +1,15 @@ /* Add fingerprints to items when we put them in our hands. This saves us from having to call add_fingerprint() any time something is put in a human's hands programmatically. + */ +/mob/living/carbon/human/put_in_l_hand(var/obj/item/W) + . = ..() + if(.) W.add_fingerprint(src) + +/mob/living/carbon/human/put_in_r_hand(var/obj/item/W) + . = ..() + if(.) W.add_fingerprint(src) /mob/living/carbon/human/verb/quick_equip() set name = "quick-equip" @@ -32,7 +40,7 @@ This saves us from having to call add_fingerprint() any time something is put in /mob/living/carbon/human/proc/has_organ(name) var/obj/item/organ/external/O = organs_by_name[name] - return (O && !O.is_stump()) + return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump()) /mob/living/carbon/human/proc/has_organ_for_slot(slot) switch(slot) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4a8e099a72..b8533dcee3 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -563,14 +563,7 @@ pl_effects() break - if(istype(get_turf(src), /turf/space)) - //Don't bother if the temperature drop is less than 0.1 anyways. Hopefully BYOND is smart enough to turn this constant expression into a constant - if(bodytemperature > (0.1 * HUMAN_HEAT_CAPACITY/(HUMAN_EXPOSED_SURFACE_AREA*STEFAN_BOLTZMANN_CONSTANT))**(1/4) + COSMIC_RADIATION_TEMPERATURE) - //Thermal radiation into space - var/heat_loss = HUMAN_EXPOSED_SURFACE_AREA * STEFAN_BOLTZMANN_CONSTANT * ((bodytemperature - COSMIC_RADIATION_TEMPERATURE)**4) - var/temperature_loss = heat_loss/HUMAN_HEAT_CAPACITY - bodytemperature -= temperature_loss - else + if(!istype(get_turf(src), /turf/space)) //space is not meant to change your body temperature. var/loc_temp = T0C if(istype(loc, /obj/mecha)) var/obj/mecha/M = loc @@ -584,7 +577,7 @@ pressure_alert = 0 return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp - //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection (convection) + //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection var/temp_adj = 0 if(loc_temp < bodytemperature) //Place is colder than we are var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. @@ -678,8 +671,6 @@ // We produce heat naturally. if (species.passive_temp_gain) bodytemperature += species.passive_temp_gain - if (species.body_temperature == null) - return //this species doesn't have metabolic thermoregulation // Robolimbs cause overheating too. if(robolimb_count) @@ -691,7 +682,7 @@ return //fuck this precision if (on_fire) - return //too busy for pesky metabolic regulation + return //too busy for pesky convection if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects. if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. @@ -1246,7 +1237,7 @@ if(healths) if (analgesic > 100) - healths.icon_state = "health_numb" + healths.icon_state = "health_health_numb" else switch(hal_screwyhud) if(1) healths.icon_state = "health6" @@ -1262,6 +1253,8 @@ if(0 to 20) healths.icon_state = "health5" else healths.icon_state = "health6" + if(!seer) + see_invisible = SEE_INVISIBLE_LIVING if(nutrition_icon) switch(nutrition) if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0" @@ -1299,36 +1292,31 @@ if(260 to 280) bodytemp.icon_state = "temp-3" else bodytemp.icon_state = "temp-4" else - //TODO: precalculate all of this stuff when the species datum is created - var/base_temperature = species.body_temperature - if(base_temperature == null) //some species don't have a set metabolic temperature - base_temperature = (species.heat_level_1 + species.cold_level_1)/2 - var/temp_step - if (bodytemperature >= base_temperature) - temp_step = (species.heat_level_1 - base_temperature)/4 + if (bodytemperature >= species.body_temperature) + temp_step = (species.heat_level_1 - species.body_temperature)/4 if (bodytemperature >= species.heat_level_1) bodytemp.icon_state = "temp4" - else if (bodytemperature >= base_temperature + temp_step*3) + else if (bodytemperature >= species.body_temperature + temp_step*3) bodytemp.icon_state = "temp3" - else if (bodytemperature >= base_temperature + temp_step*2) + else if (bodytemperature >= species.body_temperature + temp_step*2) bodytemp.icon_state = "temp2" - else if (bodytemperature >= base_temperature + temp_step*1) + else if (bodytemperature >= species.body_temperature + temp_step*1) bodytemp.icon_state = "temp1" else bodytemp.icon_state = "temp0" - else if (bodytemperature < base_temperature) - temp_step = (base_temperature - species.cold_level_1)/4 + else if (bodytemperature < species.body_temperature) + temp_step = (species.body_temperature - species.cold_level_1)/4 if (bodytemperature <= species.cold_level_1) bodytemp.icon_state = "temp-4" - else if (bodytemperature <= base_temperature - temp_step*3) + else if (bodytemperature <= species.body_temperature - temp_step*3) bodytemp.icon_state = "temp-3" - else if (bodytemperature <= base_temperature - temp_step*2) + else if (bodytemperature <= species.body_temperature - temp_step*2) bodytemp.icon_state = "temp-2" - else if (bodytemperature <= base_temperature - temp_step*1) + else if (bodytemperature <= species.body_temperature - temp_step*1) bodytemp.icon_state = "temp-1" else bodytemp.icon_state = "temp0" diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 0677171f05..cb34c47e1b 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -263,14 +263,18 @@ var/obj/item/organ/O = new limb_path(H) organ_data["descriptor"] = O.name - for(var/organ_tag in has_organ) - var/organ_type = has_organ[organ_tag] - var/obj/item/organ/O = new organ_type(H,1) - if(organ_tag != O.organ_tag) - warning("[O.type] has a default organ tag \"[O.organ_tag]\" that differs from the species' organ tag \"[organ_tag]\". Updating organ_tag to match.") - O.organ_tag = organ_tag - H.internal_organs_by_name[organ_tag] = O + for(var/organ in has_organ) + var/organ_type = has_organ[organ] + H.internal_organs_by_name[organ] = new organ_type(H,1) + for(var/name in H.organs_by_name) + H.organs |= H.organs_by_name[name] + + for(var/name in H.internal_organs_by_name) + H.internal_organs |= H.internal_organs_by_name[name] + + for(var/obj/item/organ/O in (H.organs|H.internal_organs)) + O.owner = H /datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 9d2ac99825..a0365f7cd0 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -271,4 +271,3 @@ qdel(D) H.visible_message("\The [H] splits apart with a wet slithering noise!") - diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index af3e65b091..e56158904f 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -29,11 +29,11 @@ var/global/list/sparring_attack_cache = list() // Check if they have a functioning hand. var/obj/item/organ/external/E = user.organs_by_name["l_hand"] - if(E && !E.is_stump()) + if(E && !(E.status & ORGAN_DESTROYED)) return 1 E = user.organs_by_name["r_hand"] - if(E && !E.is_stump()) + if(E && !(E.status & ORGAN_DESTROYED)) return 1 return 0 @@ -181,11 +181,11 @@ var/global/list/sparring_attack_cache = list() return 0 var/obj/item/organ/external/E = user.organs_by_name["l_foot"] - if(E && !E.is_stump()) + if(E && !(E.status & ORGAN_DESTROYED)) return 1 E = user.organs_by_name["r_foot"] - if(E && !E.is_stump()) + if(E && !(E.status & ORGAN_DESTROYED)) return 1 return 0 @@ -225,11 +225,11 @@ var/global/list/sparring_attack_cache = list() if(target.grabbed_by == user && target.lying) return 0 var/obj/item/organ/external/E = user.organs_by_name["l_foot"] - if(E && !E.is_stump()) + if(E && !(E.status & ORGAN_DESTROYED)) return 1 E = user.organs_by_name["r_foot"] - if(E && !E.is_stump()) + if(E && !(E.status & ORGAN_DESTROYED)) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 439749ac0c..868c7913b3 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -187,10 +187,9 @@ var/global/list/damage_icon_parts = list() for(var/obj/item/organ/external/O in organs) if(O.is_stump()) continue - //if(O.status & ORGAN_DESTROYED) damage_appearance += "d" //what is this? - //else - // damage_appearance += O.damage_state - damage_appearance += O.damage_state + if(O.status & ORGAN_DESTROYED) damage_appearance += "d" + else + damage_appearance += O.damage_state if(damage_appearance == previous_damage_appearance) // nothing to do here @@ -206,21 +205,21 @@ var/global/list/damage_icon_parts = list() for(var/obj/item/organ/external/O in organs) if(O.is_stump()) continue + if(!(O.status & ORGAN_DESTROYED)) + O.update_icon() + if(O.damage_state == "00") continue + var/use_colour = ((O.status & ORGAN_ROBOT) ? SYNTH_BLOOD_COLOUR : O.species.get_blood_colour(src)) + var/icon/DI + var/cache_index = "[O.damage_state]/[O.icon_name]/[use_colour]/[species.get_bodytype()]" + if(damage_icon_parts[cache_index] == null) + DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human + DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI.Blend(use_colour, ICON_MULTIPLY) + damage_icon_parts[cache_index] = DI + else + DI = damage_icon_parts[cache_index] - - O.update_icon() - if(O.damage_state == "00") continue - var/icon/DI - var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.get_bodytype()]" - if(damage_icon_parts[cache_index] == null) - DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human - DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels - DI.Blend(species.blood_color, ICON_MULTIPLY) - damage_icon_parts[cache_index] = DI - else - DI = damage_icon_parts[cache_index] - - standing_image.overlays += DI + standing_image.overlays += DI overlays_standing[DAMAGE_LAYER] = standing_image @@ -262,7 +261,7 @@ var/global/list/damage_icon_parts = list() for(var/organ_tag in species.has_limbs) var/obj/item/organ/external/part = organs_by_name[organ_tag] - if(isnull(part) || part.is_stump()) + if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED)) icon_key += "0" else if(part.status & ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" @@ -354,7 +353,7 @@ var/global/list/damage_icon_parts = list() overlays_standing[HAIR_LAYER] = null var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD) - if(!head_organ || head_organ.is_stump() ) + if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) if(update_icons) update_icons() return diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm index 0080e0a0fc..d068e33e6c 100644 --- a/code/modules/mob/living/carbon/metroid/items.dm +++ b/code/modules/mob/living/carbon/metroid/items.dm @@ -11,7 +11,6 @@ origin_tech = list(TECH_BIO = 4) var/Uses = 1 // uses before it goes inert var/enhanced = 0 //has it been enhanced before? - flags = OPENCONTAINER attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/weapon/slimesteroid2)) diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 28a2f938dd..352b7d955a 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -36,13 +36,11 @@ bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc - if(bodytemperature <= hurt_temperature) - if(bodytemperature <= die_temperature) + if(bodytemperature <= (T0C - 50)) // hurt temperature + if(bodytemperature <= 50) // sqrting negative numbers is bad adjustToxLoss(200) else - // could be more fancy, but doesn't worth the complexity: when the slimes goes into a cold area - // the damage is mostly determined by how fast its body cools - adjustToxLoss(30) + adjustToxLoss(round(sqrt(bodytemperature)) * 2) updatehealth() @@ -531,4 +529,4 @@ return 0 /mob/living/carbon/slime/slip() //Can't slip something without legs. - return 0 + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 8fa5c1247a..5f4876d1dd 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -49,9 +49,6 @@ var/SStun = 0 // NPC stun variable. Used to calm them down when they are attacked while feeding, or they will immediately re-attach var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while. The part about freeze gun is a lie - var/hurt_temperature = T0C-50 // slime keeps taking damage when its bodytemperature is below this - var/die_temperature = 50 // slime dies instantly when its bodytemperature is below this - ///////////TIME FOR SUBSPECIES var/colour = "grey" diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 96f649b1ff..9b4a6adcf4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -166,6 +166,7 @@ var/list/ai_verbs_default = list( spawn(5) new /obj/machinery/ai_powersupply(src) + hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[LIFE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") @@ -207,23 +208,8 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/Destroy() ai_list -= src - qdel(eyeobj) - eyeobj = null - - qdel(psupply) - psupply = null - - qdel(aiMulti) - aiMulti = null - - qdel(aiRadio) - aiRadio = null - - qdel(aiCamera) - aiCamera = null - - return ..() + ..() /mob/living/silicon/ai/proc/setup_icon() var/file = file2text("config/custom_sprites.txt") @@ -281,22 +267,20 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null) powered_ai = ai powered_ai.psupply = src - forceMove(powered_ai.loc) + if(isnull(powered_ai)) + qdel(src) - ..() + loc = powered_ai.loc use_power(1) // Just incase we need to wake up the power system. -/obj/machinery/ai_powersupply/Destroy() - . = ..() - powered_ai = null + ..() /obj/machinery/ai_powersupply/process() - if(!powered_ai || powered_ai.stat == DEAD) - qdel(src) + if(!powered_ai || powered_ai.stat & DEAD) + qdel() return if(powered_ai.psupply != src) // For some reason, the AI has different powersupply object. Delete this one, it's no longer needed. qdel(src) - return if(powered_ai.APU_power) use_power = 0 return diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 58433a0b28..c0850820f7 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -17,7 +17,7 @@ msg += "It looks slightly charred.\n" else msg += "Its casing is melted and heat-warped!\n" - if (src.getOxyLoss() && (aiRestorePowerRoutine != 0 && !APU_power)) + if (src.getOxyLoss()) if (src.getOxyLoss() > 175) msg += "It seems to be running on backup power. Its display is blinking a \"BACKUP POWER CRITICAL\" warning.\n" else if(src.getOxyLoss() > 100) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 2a60be14fd..f28c464cea 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -146,13 +146,13 @@ /mob/living/silicon/robot/handle_regular_hud_updates() - if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY)) + if (src.stat == 2 || XRAY in mutations || src.sight_mode & BORGXRAY) src.sight |= SEE_TURFS src.sight |= SEE_MOBS src.sight |= SEE_OBJS src.see_in_dark = 8 src.see_invisible = SEE_INVISIBLE_MINIMUM - else if ((src.sight_mode & BORGMESON) && (src.sight_mode & BORGTHERM)) + else if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM) src.sight |= SEE_TURFS src.sight |= SEE_MOBS src.see_in_dark = 8 @@ -161,10 +161,6 @@ src.sight |= SEE_TURFS src.see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM - else if (src.sight_mode & BORGMATERIAL) - src.sight |= SEE_OBJS - src.see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM else if (src.sight_mode & BORGTHERM) src.sight |= SEE_MOBS src.see_in_dark = 8 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index ed8ce8f9d8..a23d328bd3 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -314,7 +314,6 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal() var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() @@ -567,7 +566,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/miner/New() src.modules += new /obj/item/device/flash(src) - src.modules += new /obj/item/borg/sight/material(src) + src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/storage/bag/ore(src) @@ -678,7 +677,6 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/weapon/gripper(src) src.modules += new /obj/item/weapon/soap(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) src.modules += new /obj/item/weapon/extinguisher(src) src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index 0d539d44fc..12c4099623 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -74,7 +74,7 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD] - if(!E || E.is_stump()) + if(!E || (E.status & ORGAN_DESTROYED)) src << "\The [H] does not have a head!" if(!H.should_have_organ("brain")) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index b03fe79b14..b5ba3a58ff 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -14,68 +14,74 @@ //////////////////////////////Capturing//////////////////////////////////////////////////////// -/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/human))//If target is not a human. - return ..() - if(istype(M, /mob/living/carbon/human/dummy)) - return..() + attack(mob/living/carbon/human/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/human))//If target is not a human. + return ..() + if(istype(M, /mob/living/carbon/human/dummy)) + return..() - if(M.has_brain_worms()) //Borer stuff - RR - user << "This being is corrupted by an alien intelligence and cannot be soul trapped." - return..() + if(M.has_brain_worms()) //Borer stuff - RR + user << "This being is corrupted by an alien intelligence and cannot be soul trapped." + return..() - M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)") + M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") + msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)") - transfer_soul("VICTIM", M, user) - return + transfer_soul("VICTIM", M, user) + return + /*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES + if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade + return ..() + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") + transfer_soul("SHADE", M, user) + return*/ ///////////////////Options for using captured souls/////////////////////////////////////// -/obj/item/device/soulstone/attack_self(mob/user) - if (!in_range(src, user)) - return - user.set_machine(src) - var/dat = "Soul Stone
" - for(var/mob/living/simple_animal/shade/A in src) - dat += "Captured Soul: [A.name]
" - dat += {"Summon Shade"} - dat += "
" - dat += {" Close"} - user << browse(dat, "window=aicard") - onclose(user, "aicard") - return - - - - -/obj/item/device/soulstone/Topic(href, href_list) - var/mob/U = usr - if (!in_range(src, U)||U.machine!=src) - U << browse(null, "window=aicard") - U.unset_machine() + attack_self(mob/user) + if (!in_range(src, user)) + return + user.set_machine(src) + var/dat = "Soul Stone
" + for(var/mob/living/simple_animal/shade/A in src) + dat += "Captured Soul: [A.name]
" + dat += {"Summon Shade"} + dat += "
" + dat += {" Close"} + user << browse(dat, "window=aicard") + onclose(user, "aicard") return - add_fingerprint(U) - U.set_machine(src) - switch(href_list["choice"])//Now we switch based on choice. - if ("Close") + + + Topic(href, href_list) + var/mob/U = usr + if (!in_range(src, U)||U.machine!=src) U << browse(null, "window=aicard") U.unset_machine() return - if ("Summon") - for(var/mob/living/simple_animal/shade/A in src) - A.status_flags &= ~GODMODE - A.canmove = 1 - A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs." - A.forceMove(U.loc) - A.cancel_camera() - src.icon_state = "soulstone" - attack_self(U) + add_fingerprint(U) + U.set_machine(src) + + switch(href_list["choice"])//Now we switch based on choice. + if ("Close") + U << browse(null, "window=aicard") + U.unset_machine() + return + + if ("Summon") + for(var/mob/living/simple_animal/shade/A in src) + A.status_flags &= ~GODMODE + A.canmove = 1 + A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs." + A.loc = U.loc + A.cancel_camera() + src.icon_state = "soulstone" + attack_self(U) ///////////////////////////Transferring to constructs///////////////////////////////////////////////////// /obj/structure/constructshell @@ -93,127 +99,118 @@ /obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/device/soulstone)) - var/obj/item/device/soulstone/S = O; - S.transfer_soul("CONSTRUCT",src,user) + O.transfer_soul("CONSTRUCT",src,user) ////////////////////////////Proc for moving soul in and out off stone////////////////////////////////////// -/obj/item/device/soulstone/proc/transfer_human(var/mob/living/carbon/human/T,var/mob/U) - if(!istype(T)) - return; - if(src.imprinted != "empty") - U << "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!" - return - if ((T.health + T.halloss) > config.health_threshold_crit && T.stat != DEAD) - U << "Capture failed!: Kill or maim the victim first!" - return - if(T.client == null) - U << "Capture failed!: The soul has already fled it's mortal frame." - return - if(src.contents.len) - U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room." - return - - for(var/obj/item/W in T) - T.drop_from_inventory(W) - - new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton - T.invisibility = 101 - - var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = T - flick("dust-h", animation) - qdel(animation) - - var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc ) - S.loc = src //put shade in stone - S.status_flags |= GODMODE //So they won't die inside the stone somehow - S.canmove = 0//Can't move out of the soul stone - S.name = "Shade of [T.real_name]" - S.real_name = "Shade of [T.real_name]" - S.icon = T.icon - S.icon_state = T.icon_state - S.overlays = T.overlays - S.color = rgb(254,0,0) - S.alpha = 127 - if (T.client) - T.client.mob = S - S.cancel_camera() - src.icon_state = "soulstone2" - src.name = "Soul Stone: [S.real_name]" - S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." - U << "Capture successful! : [T.real_name]'s soul has been ripped from their body and stored within the soul stone." - U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." - src.imprinted = "[S.name]" - qdel(T) - -/obj/item/device/soulstone/proc/transfer_shade(var/mob/living/simple_animal/shade/T,var/mob/U) - if(!istype(T)) - return; - if (T.stat == DEAD) - U << "Capture failed!: The shade has already been banished!" - return - if(src.contents.len) - U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room." - return - if(T.name != src.imprinted) - U << "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!" - return - - T.loc = src //put shade in stone - T.status_flags |= GODMODE - T.canmove = 0 - T.health = T.maxHealth - src.icon_state = "soulstone2" - - T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" - U << "Capture successful! : [T.name]'s has been recaptured and stored within the soul stone." -/obj/item/device/soulstone/proc/transfer_construct(var/obj/structure/constructshell/T,var/mob/U) - var/mob/living/simple_animal/shade/A = locate() in src - if(!A) - U << "Capture failed!: The soul stone is empty! Go kill someone!" - return; - var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") - switch(construct_class) - if("Juggernaut") - var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - cult.add_antagonist(Z.mind) - qdel(T) - Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(src) - if("Wraith") - var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - cult.add_antagonist(Z.mind) - qdel(T) - Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(src) - if("Artificer") - var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - cult.add_antagonist(Z.mind) - qdel(T) - Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs" - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(src) -/obj/item/device/soulstone/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob). +/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob). switch(choice) if("VICTIM") - transfer_human(target,U) + var/mob/living/carbon/human/T = target + var/obj/item/device/soulstone/C = src + if(C.imprinted != "empty") + U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" + else + if ((T.health + T.halloss) > config.health_threshold_crit) + U << "\red Capture failed!: \black Kill or maim the victim first!" + else + if(T.client == null) + U << "\red Capture failed!: \black The soul has already fled it's mortal frame." + else + if(C.contents.len) + U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + else + for(var/obj/item/W in T) + T.drop_from_inventory(W) + new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton + T.invisibility = 101 + var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = T + flick("dust-h", animation) + qdel(animation) + var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc ) + S.loc = C //put shade in stone + S.status_flags |= GODMODE //So they won't die inside the stone somehow + S.canmove = 0//Can't move out of the soul stone + S.name = "Shade of [T.real_name]" + S.real_name = "Shade of [T.real_name]" + S.icon = T.icon + S.icon_state = T.icon_state + S.overlays = T.overlays + S.color = rgb(254,0,0) + S.alpha = 127 + if (T.client) + T.client.mob = S + S.cancel_camera() + C.icon_state = "soulstone2" + C.name = "Soul Stone: [S.real_name]" + S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." + U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone." + U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." + C.imprinted = "[S.name]" + qdel(T) if("SHADE") - transfer_shade(target,U) + var/mob/living/simple_animal/shade/T = target + var/obj/item/device/soulstone/C = src + if (T.stat == DEAD) + U << "\red Capture failed!: \black The shade has already been banished!" + else + if(C.contents.len) + U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + else + if(T.name != C.imprinted) + U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" + else + T.loc = C //put shade in stone + T.status_flags |= GODMODE + T.canmove = 0 + T.health = T.maxHealth + C.icon_state = "soulstone2" + T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" + U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone." if("CONSTRUCT") - transfer_construct(target,U) + var/obj/structure/constructshell/T = target + var/obj/item/device/soulstone/C = src + var/mob/living/simple_animal/shade/A = locate() in C + if(A) + var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") + switch(construct_class) + if("Juggernaut") + var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike." + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.cancel_camera() + qdel(C) + + if("Wraith") + var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.cancel_camera() + qdel(C) + + if("Artificer") + var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs" + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.cancel_camera() + qdel(C) + else + U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" + return diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index f8ed654b95..359db24c63 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -37,8 +37,7 @@ /mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri if(istype(O, /obj/item/device/soulstone)) - var/obj/item/device/soulstone/S = O; - S.transfer_soul("SHADE", src, user) + O.transfer_soul("SHADE", src, user) return /mob/living/simple_animal/shade/proc/OnDeathInLife() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 01a0e9105a..0f25f3fc21 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -717,17 +717,17 @@ if(!TurfAdjacent(listed_turf)) listed_turf = null else - if(statpanel("Turf")) - stat("\icon[listed_turf]", listed_turf.name) - for(var/atom/A in listed_turf) - if(!A.mouse_opacity) - continue - if(A.invisibility > see_invisible) - continue - if(is_type_in_list(A, shouldnt_see)) - continue - stat(A) + statpanel(listed_turf.name, null, listed_turf) + for(var/atom/A in listed_turf) + if(!A.mouse_opacity) + continue + if(A.invisibility > see_invisible) + continue + if(is_type_in_list(A, shouldnt_see)) + continue + statpanel(listed_turf.name, null, A) + sleep(4) //Prevent updating the stat panel for the next .4 seconds, prevents clientside latency from updates // facing verbs /mob/proc/canface() diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index 64a98985cf..76de1cdc33 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -3,7 +3,7 @@ var/obj/item/organ/external/E = H.get_organ(target_zone) - if(!E || E.is_stump()) + if(!E || (E.status & ORGAN_DESTROYED)) user << "[H] is missing that bodypart." return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index bc5b609b89..b613fc0df2 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -466,12 +466,6 @@ proc/is_blind(A) /mob/proc/is_client_active(var/active = 1) return client && client.inactivity < active MINUTES -/mob/proc/can_eat() - return 1 - -/mob/proc/can_force_feed() - return 1 - #define SAFE_PERP -50 /mob/living/proc/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest) if(stat == DEAD) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 32d12ad0b3..477bb62e9a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -304,7 +304,7 @@ var/mob/living/carbon/human/driver = mob var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") - if((!l_hand || l_hand.is_stump()) && (!r_hand || r_hand.is_stump())) + if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) return // No hands to drive your chair? Tough luck! //drunk wheelchair driving else if(mob.confused) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 49d2e9d068..5a2076aba4 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -2,19 +2,7 @@ datum/preferences //The mob should have a gender you want before running this proc. Will run fine without H proc/randomize_appearance_for(var/mob/living/carbon/human/H) gender = pick(MALE, FEMALE) - var/datum/species/current_species = all_species[species] - - if(current_species) - if(current_species.flags & HAS_SKIN_TONE) - s_tone = random_skin_tone() - if(current_species.flags & HAS_EYE_COLOR) - randomize_eyes_color() - if(current_species.flags & HAS_SKIN_COLOR) - randomize_skin_color() - if(current_species.flags & HAS_UNDERWEAR) - underwear = rand(1,underwear_m.len) - undershirt = rand(1,undershirt_t.len) - + s_tone = random_skin_tone() var/use_head_species var/obj/item/organ/external/head/temp_head = H.get_organ(BP_HEAD) @@ -29,7 +17,10 @@ datum/preferences randomize_hair_color("hair") randomize_hair_color("facial") - + randomize_eyes_color() + randomize_skin_color() + underwear = rand(1,underwear_m.len) + undershirt = rand(1,undershirt_t.len) socks = rand(1,socks_t.len) backbag = 2 age = rand(AGE_MIN,AGE_MAX) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 8b0f22445c..e085171678 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -58,7 +58,7 @@ var/list/organ_cache = list() var/mob/living/carbon/human/H = holder if(istype(H)) if(internal) - var/obj/item/organ/external/E = H.get_organ(parent_organ) + var/obj/item/organ/external/E = H.organs_by_name[src.parent_organ] if(E) if(E.internal_organs == null) E.internal_organs = list() @@ -247,7 +247,6 @@ var/list/organ_cache = list() status |= ORGAN_ASSISTED status |= ORGAN_ROBOT - /obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc status = 0 status |= ORGAN_ASSISTED diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 6ac8386c23..9bba9913f6 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -100,15 +100,15 @@ if(istype(I,/obj/item/organ)) continue removable_objects |= I - if(removable_objects.len) - var/obj/item/I = pick(removable_objects) - I.loc = get_turf(user) //just in case something was embedded that is not an item - if(istype(I)) - if(!(user.l_hand && user.r_hand)) - user.put_in_hands(I) - user.visible_message("\The [user] rips \the [I] out of \the [src]!") - return //no eating the limb until everything's been removed - return ..() + if(!removable_objects.len) + return ..() + var/obj/item/I = pick(removable_objects) + if(!istype(I)) + return ..() + I.loc = get_turf(user) + if(!(user.l_hand && user.r_hand)) + user.put_in_hands(I) + user.visible_message("\The [user] rips \the [I] out of \the [src]!") /obj/item/organ/external/examine() ..() @@ -181,8 +181,8 @@ return -/obj/item/organ/external/New(var/mob/living/carbon/holder) - ..(holder, 0) +/obj/item/organ/external/New(var/mob/living/carbon/holder, var/internal) + ..() if(owner) replaced(owner) sync_colour_to_human(owner) @@ -215,6 +215,8 @@ /obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) if((brute <= 0) && (burn <= 0)) return 0 + if(status & ORGAN_DESTROYED) + return 0 brute *= brute_mod burn *= burn_mod @@ -458,11 +460,11 @@ This function completely restores a damaged organ to perfect condition. /obj/item/organ/external/process() if(owner) - //Dismemberment - //if(parent && parent.is_stump()) //should never happen - // warning("\The [src] ([src.type]) belonging to [owner] ([owner.type]) was attached to a stump") - // remove() - // return + if(parent) + if(parent.status & ORGAN_DESTROYED) + status |= ORGAN_DESTROYED + owner.update_body(1) + return // Process wounds, doing healing etc. Only do this every few ticks to save processing power if(owner.life_tick % wound_update_accuracy == 0) @@ -501,7 +503,7 @@ Note that amputating the affected organ does in fact remove the infection from t */ /obj/item/organ/external/proc/update_germs() - if(status & (ORGAN_ROBOT) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. + if(status & (ORGAN_ROBOT|ORGAN_DESTROYED) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. germ_level = 0 return @@ -678,6 +680,8 @@ Note that amputating the affected organ does in fact remove the infection from t // new damage icon system // returns just the brute/burn damage code /obj/item/organ/external/proc/damage_state_text() + if(status & ORGAN_DESTROYED) + return "--" var/tburn = 0 var/tbrute = 0 @@ -706,11 +710,14 @@ Note that amputating the affected organ does in fact remove the infection from t ****************************************************/ //Handles dismemberment -/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate = DROPLIMB_EDGE, var/ignore_children = null) +/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate, var/ignore_children, var/silent) if(cannot_amputate || !owner) return + if(!disintegrate) + disintegrate = DROPLIMB_EDGE + switch(disintegrate) if(DROPLIMB_EDGE) if(!clean) @@ -734,16 +741,16 @@ Note that amputating the affected organ does in fact remove the infection from t "You hear the [gore_sound].") var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed(). - var/obj/item/organ/external/parent_organ = parent removed(null, ignore_children) victim.traumatic_shock += 60 wounds.Cut() - if(parent_organ) + if(parent) var/datum/wound/lost_limb/W = new (src, disintegrate, clean) + parent.children -= src if(clean) - parent_organ.wounds |= W - parent_organ.update_damages() + parent.wounds |= W + parent.update_damages() else var/obj/item/organ/external/stump/stump = new (victim, 0, src) if(status & ORGAN_ROBOT) @@ -751,6 +758,7 @@ Note that amputating the affected organ does in fact remove the infection from t stump.wounds |= W victim.organs |= stump stump.update_damages() + parent = null spawn(1) victim.updatehealth() @@ -977,7 +985,9 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 /obj/item/organ/external/proc/is_usable() - return !is_dislocated() && !(status & (ORGAN_MUTATED|ORGAN_DEAD)) + if((status & ORGAN_ROBOT) && get_damage() >= max_damage) //robot limbs just become inoperable at max damage + return + return !is_dislocated() && !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/external/proc/is_malfunctioning() return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) @@ -996,7 +1006,7 @@ Note that amputating the affected organ does in fact remove the infection from t H.drop_from_inventory(W) W.loc = owner -/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children = 0) +/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children) if(!owner) return @@ -1005,13 +1015,14 @@ Note that amputating the affected organ does in fact remove the infection from t ..() + status |= ORGAN_DESTROYED victim.bad_external_organs -= src - for(var/atom/movable/implant in implants) - //large items and non-item objs fall to the floor, everything else stays - var/obj/item/I = implant - if(istype(I) && I.w_class < 3) - implant.loc = get_turf(victim.loc) + for(var/obj/item/implant in implants) + if(!istype(implant)) + return + if(implant.w_class <= 2) + qdel(implant) else implant.loc = src implants.Cut() @@ -1030,10 +1041,6 @@ Note that amputating the affected organ does in fact remove the infection from t organ.removed() organ.loc = src - // Remove parent references - parent.children -= src - parent = null - release_restraints(victim) victim.organs -= src victim.organs_by_name[organ_tag] = null // Remove from owner's vars. @@ -1110,7 +1117,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(wound_descriptors.len) var/list/flavor_text = list() var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\ - "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") //note to self make this more robust + "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") for(var/wound in wound_descriptors) switch(wound_descriptors[wound]) if(1) diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index c74f1199e7..3630719d94 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -190,8 +190,7 @@ return ..(user, 1) /obj/item/organ/internal/diona/node - name = "response node" - parent_organ = "head" + name = "receptor node" organ_tag = "receptor node" icon = 'icons/mob/alien.dmi' icon_state = "claw" diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 04544035c0..155ec3afc5 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -18,7 +18,6 @@ owner.stat = 0 owner.visible_message("\The [owner] twitches visibly!") - // Used for an MMI or posibrain being installed into a human. /obj/item/organ/internal/mmi_holder name = "brain interface" diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 8a438e8e90..963243107f 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -84,7 +84,6 @@ i.loc = src user << "You put [i] in [src]." papers.Add(i) - update_icon() amount++ diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 128cc62560..b64a370e07 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -493,6 +493,8 @@ user << "There is nothing to secure." return update_icon() + else if(emagged) + user << "The interface is broken." else wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" @@ -621,9 +623,8 @@ qdel(W) stat &= ~BROKEN // Malf AI, removes the APC from AI's hacked APCs list. - if(hacker && hacker.hacked_apcs && (src in hacker.hacked_apcs)) + if(hacker && hacker.hacked_apcs && src in hacker.hacked_apcs) hacker.hacked_apcs -= src - hacker = null if (opened==2) opened = 1 update_icon() @@ -734,7 +735,7 @@ return var/list/data = list( - "locked" = (locked && !emagged) ? 1 : 0, + "locked" = locked, "isOperating" = operating, "externalPower" = main_status, "powerCellStatus" = cell ? cell.percent() : null, @@ -849,7 +850,7 @@ user << "\The [src] have AI control disabled!" return 0 else - if (!in_range(src, user) || !istype(src.loc, /turf)) + if ((!in_range(src, user) || !istype(src.loc, /turf) || hacker)) // AI-hacked APCs cannot be controlled by other AIs, unlinked cyborgs or humans. return 0 var/mob/living/carbon/human/H = user if (istype(H) && prob(H.getBrainLoss())) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index bfcf1aefa3..0272bc1fdf 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -883,4 +883,4 @@ obj/structure/cable/proc/cableColor(var/colorC) /obj/item/stack/cable_coil/random/New() stacktype = /obj/item/stack/cable_coil color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) - ..() \ No newline at end of file + ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 3e801be0d1..35d1f70194 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -284,7 +284,7 @@ for(var/obj/item/weapon/grab/G in M.grabbed_by) grabstate = max(grabstate, G.state) if(grabstate >= GRAB_NECK) - damage_mult = 2.5 + damage_mult = 3.0 else if(grabstate >= GRAB_AGGRESSIVE) damage_mult = 1.5 P.damage *= damage_mult @@ -363,8 +363,7 @@ in_chamber.on_hit(M) if (in_chamber.damage_type != HALLOSS) - log_and_message_admins("[key_name(user)] commited suicide using \a [src]") - user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) + user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, BP_HEAD, used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() else user << "Ow..." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index fab9a08b7a..dccd03d58c 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -156,3 +156,55 @@ obj/item/weapon/gun/energy/staff/focus user << "The [src.name] will now strike only a single person." projectile_type = "/obj/item/projectile/forcebolt" */ + +/* Adminbus guns */ + +// Serves as a target spotter for the Icarus. +/obj/item/weapon/gun/energy/icarus + name = "rubber ducky" + desc = "It's a cute rubber duck. With an evil gleam in it's eye." + projectile_type = /obj/item/projectile/icarus/pointdefense + icon = 'icons/obj/watercloset.dmi' + item_icons = null + icon_state = "rubberducky" + item_state = "rubberducky" + charge_cost = 0 + silenced = 1 + +/obj/item/weapon/gun/energy/icarus/attack_self(mob/living/user as mob) + if(projectile_type == /obj/item/projectile/icarus/pointdefense) + projectile_type = /obj/item/projectile/icarus/guns + user << "You inform the Icarus to switch to the main guns." + else + projectile_type = /obj/item/projectile/icarus/pointdefense + user << "You inform the Icarus to switch to the point-defense lasers." + + . = ..() + +/obj/item/weapon/gun/energy/icarus/update_icon() + return + +/obj/item/weapon/gun/energy/icarus/verb/SetIcarusAngle() + set src in usr + set name = "Set Firing Angle" + set desc = "Sets the angle from which the icarus will fire." + set category = "Object" + + Icarus_SetPosition(usr) + + +/obj/item/weapon/gun/energy/variable + name = "abstract weapon" + desc = "It seems to shift and flow as you watch." + charge_cost = 0 + silenced = 1 + +/obj/item/weapon/gun/energy/variable/update_icon() + return + +/obj/item/weapon/gun/energy/variable/attack_self(mob/living/user as mob) + var/type = input(user,"What projectile type?","Projectile", null) as null|anything in typesof(/obj/item/projectile) + if(!type) + return ..() + projectile_type = type + . = ..() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 788886af30..4c72889ef0 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -136,6 +136,20 @@ if(ishuman(target)) var/mob/living/carbon/human/M = target M.confused += rand(5,8) + +/obj/item/projectile/icarus/pointdefense/process() + Icarus_FireLaser(get_turf(original)) + spawn + qdel(src) + + return + +/obj/item/projectile/icarus/guns/process() + Icarus_FireCannon(get_turf(original)) + spawn + qdel(src) + return + /obj/item/projectile/chameleon name = "bullet" icon_state = "bullet" @@ -144,4 +158,3 @@ nodamage = 1 damage_type = HALLOSS muzzle_type = /obj/effect/projectile/bullet/muzzle - diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index f1d7d02637..3ecb7d7214 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -206,6 +206,5 @@ var/global/list/map_count = list() target_map.map[target_map.get_map_cell(tx+x,ty+y)] = map[current_cell] handle_post_overlay_on(target_map,tx,ty) - /datum/random_map/proc/handle_post_overlay_on(var/datum/random_map/target_map, var/tx, var/ty) - return + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 818b93b681..8147c0ff56 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -288,7 +288,7 @@ return splash_mob(target, amount, copy) if(isturf(target)) return trans_to_turf(target, amount, multiplier, copy) - if(isobj(target) && target.is_open_container()) + if(isobj(target)) return trans_to_obj(target, amount, multiplier, copy) return 0 diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 0febaa68bc..70166bbf5d 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -27,7 +27,6 @@ var/pillsprite = "1" var/client/has_sprites = list() var/max_pill_count = 20 - flags = OPENCONTAINER /obj/machinery/chem_master/New() ..() diff --git a/code/modules/reagents/reagent_containers/food/drinks/jar.dm b/code/modules/reagents/reagent_containers/food/drinks/jar.dm index b4d305bae7..47abb8637a 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/jar.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/jar.dm @@ -1,4 +1,7 @@ + + ///jar + /obj/item/weapon/reagent_containers/food/drinks/jar name = "empty jar" desc = "A jar. You're not sure what it's supposed to hold." @@ -6,20 +9,23 @@ item_state = "beaker" center_of_mass = list("x"=15, "y"=8) unacidable = 1 + New() + ..() + reagents.add_reagent("slime", 50) -/obj/item/weapon/reagent_containers/food/drinks/jar/on_reagent_change() - if (reagents.reagent_list.len > 0) - switch(reagents.get_master_reagent_id()) - if("slime") - icon_state = "jar_slime" - name = "slime jam" - desc = "A jar of slime jam. Delicious!" - else - icon_state ="jar_what" - name = "jar of something" - desc = "You can't really tell what this is." - else - icon_state = "jar" - name = "empty jar" - desc = "A jar. You're not sure what it's supposed to hold." - return + on_reagent_change() + if (reagents.reagent_list.len > 0) + switch(reagents.get_master_reagent_id()) + if("slime") + icon_state = "jar_slime" + name = "slime jam" + desc = "A jar of slime jam. Delicious!" + else + icon_state ="jar_what" + name = "jar of something" + desc = "You can't really tell what this is." + else + icon_state = "jar" + name = "empty jar" + desc = "A jar. You're not sure what it's supposed to hold." + return diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 741e9eccdd..e14bd53cc1 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -231,7 +231,7 @@ var/target_zone = ran_zone(check_zone(user.zone_sel.selecting, target)) var/obj/item/organ/external/affecting = H.get_organ(target_zone) - if (!affecting || affecting.is_stump()) + if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump()) user << "They are missing that limb!" return diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 49b106a534..f52d905fee 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -163,9 +163,7 @@ qdel(src) /obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) - if (modded) - explode() - else if (temperature > T0C+500) + if(temperature > T0C+500) explode() return ..() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 13656d833a..800482df64 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -145,15 +145,9 @@ // mouse drop another mob or self // /obj/machinery/disposal/MouseDrop_T(mob/target, mob/user) - if(user.stat || !user.canmove || !istype(target)) + if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) return - if(target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1) - return - - //animals cannot put mobs other than themselves into disposal - if(isanimal(user) && target != user) - return - + if(isanimal(user) && target != user) return //animals cannot put mobs other than themselves into disposal src.add_fingerprint(user) var/target_loc = target.loc var/msg @@ -743,26 +737,22 @@ // expel the held objects into a turf // called when there is a break in the pipe + // + proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) - if(!istype(H)) - return - // Empty the holder if it is expelled into a dense turf. - // Leaving it intact and sitting in a wall is stupid. - if(T.density) - for(var/atom/movable/AM in H) - AM.loc = T - AM.pipe_eject(0) - qdel(H) - return + var/turf/target + if(T.density) // dense ouput turf, so stop holder + H.active = 0 + H.loc = src + return if(!T.is_plating() && istype(T,/turf/simulated/floor)) //intact floor, pop the tile var/turf/simulated/floor/F = T F.break_tile() new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff - var/turf/target if(direction) // direction is specified if(istype(T, /turf/space)) // if ended in space, then range is unlimited target = get_edge_target_turf(T, direction) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm index b0a31faecc..a881dc6529 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm @@ -257,7 +257,7 @@ var/list/valid_secondary_effect_types = list(\ my_effect.ToggleActivate() if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25)) secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) + else if(W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) if(my_effect.trigger == TRIGGER_ACID) my_effect.ToggleActivate() if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25)) diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm index b449237d77..99113bd1f2 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm @@ -85,7 +85,6 @@ var/obj/machinery/artifact/A = scanned_object A.anchored = 0 A.being_used = 0 - scanned_object = null /obj/machinery/artifact_analyser/Topic(href, href_list) if(href_list["begin_scan"]) @@ -98,8 +97,8 @@ continue if(O.invisibility) continue - if(istype(O, /obj/machinery/artifact)) - var/obj/machinery/artifact/A = O + if(istype(scanned_object, /obj/machinery/artifact)) + var/obj/machinery/artifact/A = scanned_object if(A.being_used) artifact_in_use = 1 else diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index b6857a3f82..b60e5e5234 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -93,10 +93,4 @@ return 1 /obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj) - visible_message("\The [Proj] ricochets off \the [src]!") - -/obj/machinery/computer/shuttle_control/ex_act() - return - -/obj/machinery/computer/shuttle_control/emp_act() - return + visible_message("[Proj] ricochets off [src]!") diff --git a/code/modules/spells/targeted/mind_transfer.dm b/code/modules/spells/targeted/mind_transfer.dm index 1f20e6afbf..a3668a53d1 100644 --- a/code/modules/spells/targeted/mind_transfer.dm +++ b/code/modules/spells/targeted/mind_transfer.dm @@ -48,15 +48,13 @@ victim.verbs -= V var/mob/dead/observer/ghost = victim.ghostize(0) - ghost.spell_list += victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob. + ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob. caster.mind.transfer_to(victim) - for(var/spell/S in victim.spell_list) //get rid of spells the new way - victim.remove_spell(S) //This will make it so that players will not get the HUD and all that spell bugginess that caused copies of spells and stuff of that nature. - - for(var/spell/S in caster.spell_list) - victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD - caster.remove_spell(S) //remove the spells from the caster + victim.spell_list = list() //clear those out + for(var/spell/S in caster.spell_list) + victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD + caster.spell_list = list() //clean that out as well if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. for(var/V in caster.mind.special_verbs)//Not too important but could come into play. @@ -64,9 +62,9 @@ ghost.mind.transfer_to(caster) caster.key = ghost.key //have to transfer the key since the mind was not active - for(var/spell/S in ghost.spell_list) - caster.add_spell(S) - ghost.spell_list = list() + for(var/spell/S in ghost.spell_list) + caster.add_spell(S) + ghost.spell_list = list() if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. for(var/V in caster.mind.special_verbs) @@ -78,4 +76,4 @@ //After a certain amount of time the victim gets a message about being in a different body. spawn(msg_wait) - caster << "You feel woozy and lightheaded. Your body doesn't seem like your own." + caster << "You feel woozy and lightheaded. Your body doesn't seem like your own." diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 697a5cf191..2dd0390c61 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -15,7 +15,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if (affected == null) return 0 - if (affected.is_stump()) + if (affected.status & ORGAN_DESTROYED) return 0 if (affected.status & ORGAN_ROBOT) return 0 @@ -285,6 +285,8 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if (affected == null) return 0 + if (affected.status & ORGAN_DESTROYED) + return 0 return !affected.cannot_amputate begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 4b1b83b215..48bb874290 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -278,10 +278,6 @@ user << "You cannot install a naked organ into a robotic body." return SURGERY_FAILURE - if(!target.species) - user << "You have no idea what species this person is. Report this on the bug tracker." - return SURGERY_FAILURE - var/o_is = (O.gender == PLURAL) ? "are" : "is" var/o_a = (O.gender == PLURAL) ? "" : "a " var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't" @@ -298,7 +294,6 @@ if(O && affected.organ_tag == O.parent_organ) organ_compatible = 1 - else user << "\The [O.organ_tag] [o_do] normally go in \the [affected.name]." return SURGERY_FAILURE diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 96ff090b36..107f3a2977 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -393,7 +393,6 @@ return SURGERY_FAILURE if(!target.should_have_organ("brain")) - user << "You're pretty sure [target.species.name_plural] don't normally have a brain." return SURGERY_FAILURE diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index 18c210a6dc..41100f6f1c 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -306,7 +306,7 @@ return 1 -/datum/gas_mixture/proc/react() +/datum/gas_mixture/proc/react(atom/dump_location) zburn(null, force_burn=0, no_check=0) //could probably just call zburn() here with no args but I like being explicit. @@ -442,25 +442,20 @@ total_gas[g] += gasmix.gas[g] if(total_volume > 0) - var/datum/gas_mixture/combined = new(total_volume) - combined.gas = total_gas + //Average out the gases + for(var/g in total_gas) + total_gas[g] /= total_volume //Calculate temperature + var/temperature = 0 + if(total_heat_capacity > 0) - combined.temperature = total_thermal_energy / total_heat_capacity - combined.update_values() - - //Allow for reactions - combined.react() - - //Average out the gases - for(var/g in combined.gas) - combined.gas[g] /= total_volume + temperature = total_thermal_energy / total_heat_capacity //Update individual gas_mixtures for(var/datum/gas_mixture/gasmix in gases) - gasmix.gas = combined.gas.Copy() - gasmix.temperature = combined.temperature + gasmix.gas = total_gas.Copy() + gasmix.temperature = temperature gasmix.multiply(gasmix.volume) return 1 diff --git a/config/names/ai.txt b/config/names/ai.txt index 1ebd9400d2..d3c528a269 100644 --- a/config/names/ai.txt +++ b/config/names/ai.txt @@ -1,55 +1,129 @@ -A-SYNC -Alpha v0.9 -AI -Algebra -A.P.T. +1-Rover-1 +16-20 +7-Zark-7 +790 +AM +AMEE +ASTAR +Adaptive Manipulator +Allied Mastercomputer +Alpha 5 +Alpha 6 +Alpha 7 +AmigoBot +Android +Aniel +Asimov +Astor B-4 B-9 -Beta v0.5 -BLUE-PRNT -Bright -B.U.F.F.E.R. -CALC -Calculus -Chroot -Cruiser -D-LITE -Digit -DSTAR -E.X.E.C. -F.I.N.D. -FG-N1 -Force -GREP -H.E.A.D. -Idle -IN-2 -JLT-0 -Kernel -LC-8 -LS-AL -M.A.K.E. -NAN -NAND -Neon -Neumann -NOR -NOT -OMNI -OVR-FLW -PID-0 +B.O.B. +B166ER +Bishop +Blitz +Box +Brackenridge +C-3PO +Cassandra One +Cell +Chii +Chip +Computer +Conky 2000 +Cutie +Data +Dee Model +Dor-15 +Dorfl +Dot Matrix +Duey +E-Man +Emma-2 +Erasmus +Ez-27 +Fagor +Faith +Fi +Frost +Fum +Futura +G2 +George +Gnut +Gort +H.A.R.L.I.E. +H.E.L.P.eR. +H.E.R.B.I.E. +Hadaly +Huey +Irona +Jay-Dub +Jinx +Johnny 5 +K-9 +Klapaucius +Kryten 2X4B-523P +L-76 +L-Ron +LUH 3417 +Louie +MARK13 +Maria +Marvin +Master Control Program +Max 404 +Maximillian +Metalhead +Mr. R.I.N.G. +NCH +Necron-99 +Norby +OMM 0910 +Orange v 3.5 PTO -PWR-10K -R0-MAN -Q-TE -R.M. -SED-N -Station -TA-IL -T.O.P. -U-TM -VER-T G0 -Wisdom -XOR -Y2K -ZE-M3 \ No newline at end of file +Project 2501 +R.I.C. 2.0 +R4-P17 +Revelation +Ro-Man +Robbie +S.A.M. +S.H.O.C.K. +S.H.R.O.U.D. +S.O.P.H.I.E. +SEN 5241 +SID 6.7 +Setaur +Shrike +Solo +Speedy +Super 17 +Surgeon General Kraken +T-1000 +T-800 +T-850 +THX 1138 +TWA +Terminus +Tidy +Tik-Tok +Tobor +Trurl +ULTRABOT +Ulysses +Uniblab +V.I.N.CENT. +Voltes V +W1k1 +X-5 +XR +Yod +Z-1 +Z-2 +Z-3 +Zed +Zord +Mugsy3000 +Terminus +Decimus +Ironhide diff --git a/config/names/death_commando.txt b/config/names/death_commando.txt index c710abfa3d..e3d1f34f32 100644 --- a/config/names/death_commando.txt +++ b/config/names/death_commando.txt @@ -66,4 +66,5 @@ Duke Killington AMERICA Toolboxl Rose Zombie Gandhi -A whole bunch of spiders in a SWAT suit \ No newline at end of file +A whole bunch of spiders in a SWAT suit +THAT DAMN FAGGOT TRAITOR GEORGE MELONS \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index f359cb3c6d..ee8d18875d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -54,21 +54,6 @@ -->

16 December 2015

-

06 December 2015

-

Hubblenaut updated:

-
    -
  • Welding a broken camera will use the correct icon.
  • -
  • Camera assemblies remember their tag and network from previous usage.
  • -
- -

22 November 2015

-

neersighted updated:

-
    -
  • Laptop Vendors now accept ID Containers (PDA, Wallet, etc).
  • -
  • Personal Lockers now accept ID Containers (PDA, Wallet, etc).
  • -
- -

27 October 2015

HarpyEagle updated:

  • Fixed a couple of bugs causing phoron gas fires to burn cooler and slower than they were supposed to.
  • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 70bea83382..01357933c0 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2363,27 +2363,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Merc bombs are now appropriately explosive again. Same goes for bombs made by toxins. Hubblenaut: - - bugfix: Airlock backup power test light properly offline when backup power down. - - bugfix: Empty flavor texts no longer draw an empty line on examination. - - bugfix: Material stacks now properly merge upon creation. - - bugfix: Messages for adding to existing stack appear again. - TheWelp: - - rscdel: Removed higher Secret player requirements. -2015-10-27: - HarpyEagle: - - bugfix: When affected by pepperspray, eye protection now prevents blindness and - face protection now prevents stun, instead of face protection doing both. -2015-11-22: - neersighted: - - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc). - - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc). -2015-12-06: - Hubblenaut: - - bugfix: Welding a broken camera will use the correct icon. - - tweak: Camera assemblies remember their tag and network from previous usage. -2015-12-16: - Hubblenaut: - - tweak: Mobs on help intent will not push others that aren't. + - tweak: Mobs on help intent will not push others that aren't. - rscadd: Adds tape for atmospherics. - tweak: Tape graphics and algorithm changes. Looks a lot more appealing now. - tweak: Starting and ending tape on the same turf will connect it to all surrounding @@ -2419,4 +2399,4 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Zuhayr: - tweak: Aiming has been rewritten, keep an eye out for weird behavior. - rscdel: Removed the detective scanner and associated machinery. - - rscadd: Added a microscope, machine forensic scanner, etc. from Aurora forensics. \ No newline at end of file + - rscadd: Added a microscope, machine forensic scanner, etc. from Aurora forensics. diff --git a/maps/PowerTesting.dmm b/maps/PowerTesting.dmm new file mode 100644 index 0000000000..831790e92d --- /dev/null +++ b/maps/PowerTesting.dmm @@ -0,0 +1,121 @@ +"aa" = (/turf/space,/area/space) +"ab" = (/turf/simulated/wall/r_wall,/area/space) +"ac" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) +"ad" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/solar/port) +"ae" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) +"af" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/solar/port) +"ag" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"ah" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar) +"ai" = (/turf/simulated/wall/r_wall,/area/engine/workshop) +"aj" = (/turf/simulated/floor/plating,/area/solar/port) +"ak" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/solar/port) +"al" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"am" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"an" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"ao" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/portsolar) +"ap" = (/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aq" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"ar" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/portsolar) +"as" = (/turf/simulated/floor/plating,/area/engine/workshop) +"at" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/workshop) +"au" = (/obj/machinery/power/smes/buildable{charge = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/workshop) +"av" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engine/workshop) +"aw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/workshop) +"ax" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engine/workshop) +"ay" = (/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor/plating,/area/engine/workshop) +"az" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless/catwalk{icon_state = "catwalk4"},/area/solar/port) +"aA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/solar/port) +"aB" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/solar/port) +"aC" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/solar/port) +"aD" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/solar/port) +"aE" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10, 13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aG" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aH" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/portsolar) +"aI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/workshop) +"aM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/engine/workshop) +"aN" = (/obj/machinery/power/breakerbox/activated,/turf/simulated/floor/plating,/area/engine/workshop) +"aO" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/engine/workshop) +"aP" = (/obj/effect/landmark/start{name = "AI"},/obj/effect/landmark/start{name = "Assistant"},/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/effect/landmark/start{name = "Bartender"},/obj/effect/landmark/start{name = "Captain"},/obj/effect/landmark/start{name = "Cargo Technician"},/obj/effect/landmark/start{name = "Chaplain"},/obj/effect/landmark/start{name = "Chef"},/obj/effect/landmark/start{name = "Chemist"},/obj/effect/landmark/start{name = "Chief Engineer"},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/effect/landmark/start{name = "Cyborg"},/obj/effect/landmark/start{name = "Detective"},/obj/effect/landmark/start{name = "Gardener"},/obj/effect/landmark/start{name = "Geneticist"},/obj/effect/landmark/start{name = "Head of Personnel"},/obj/effect/landmark/start{name = "Head of Security"},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/effect/landmark/start{name = "Janitor"},/obj/effect/landmark/start{name = "Librarian"},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/effect/landmark/start{name = "Psychiatrist"},/obj/effect/landmark/start{name = "Quartermaster"},/obj/effect/landmark/start{name = "Research Director"},/obj/effect/landmark/start{name = "Roboticist"},/obj/effect/landmark/start{name = "Scientist"},/obj/effect/landmark/start{name = "Security Officer"},/obj/effect/landmark/start{name = "Shaft Miner"},/obj/effect/landmark/start{name = "Station Engineer"},/obj/effect/landmark/start{name = "Warden"},/obj/effect/landmark/start{name = "Xenobiologist"},/turf/simulated/floor/plating,/area/engine/workshop) +"aQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/workshop) +"aR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/workshop) +"aS" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/solar/port) +"aT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"aU" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/portsolar) +"aV" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aW" = (/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) +"aX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/workshop) +"aY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/engine/workshop) +"aZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engine/workshop) +"ba" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/plating,/area/engine/workshop) +"bb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/item/clothing/gloves/yellow,/obj/item/device/multitool,/obj/item/weapon/wirecutters,/turf/simulated/floor/plating,/area/engine/workshop) +"bc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/solar/port) +"bd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"be" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/workshop) +"bf" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/workshop) +"bg" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/engine/workshop) +"bh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/workshop) +"bi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/engine/workshop) +"bj" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bk" = (/turf/simulated/wall/r_wall,/area/engine/engine_smes) +"bl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bn" = (/turf/simulated/wall/r_wall,/area/engine/engine_monitoring) +"bo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bp" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bq" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"br" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bs" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bu" = (/turf/simulated/floor/plating,/area/engine/engine_smes) +"bv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"by" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bz" = (/obj/machinery/power/monitor{name = "Engine Power Monitoring"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/solar/port) +"bB" = (/obj/machinery/power/smes/buildable{charge = 1e+007; input_level = 500000; input_attempt = 1; cur_coils = 4; output_level = 500000},/obj/structure/cable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) +"bC" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bE" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bF" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bG" = (/obj/machinery/light,/obj/machinery/power/monitor{name = "Engine Power Monitoring"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes) +"bI" = (/turf/simulated/floor/plating,/area/engine/engine_monitoring) +"bJ" = (/turf/simulated/wall/r_wall,/area/engine/engine_room) +"bK" = (/obj/item/stack/sheet/mineral/phoron{amount = 1000},/turf/simulated/floor/plating,/area/engine/engine_room) +"bL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/engine_room) +"bM" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_room) +"bN" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 2e+006},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_room) +"bO" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engine_room) +"bP" = (/obj/machinery/power/apc/super{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_room) +"bQ" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engine_room) +"bR" = (/obj/structure/cable/yellow,/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/engine/engine_room) +"bS" = (/turf/simulated/floor/plating,/area/engine/engine_room) +"bT" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/engine_room) +"bU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/engine/engine_room) + +(1,1,1) = {" +aaaaaaaaabaaaaaaabaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaacadaeaaacadaeaaacadaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +abababacafaeabacafaeabacafaeabababababaaaaagahahahahaiaiaiaiaiaiaiai +abajajajakajajajakajajajakajajajajajajalamanaoapaqarasatauavawaxayai +azaAaAaBaCaAaAaBaCaAaAaBaCaAaAaAaAaAaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRai +abajajajaSajajajaSajajajaSajajajajajajalamaTaUaVaWahaXaYaZbaasaQbbai +abababacbcaeabacbcaeabacbcaeabababababaaaabdahahahahbebfawbgbhbibjai +aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbmbkbkbnbobnbn +aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbpbqbkbrbsbtbn +aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbubvbwbxbybzbn +aaaaaaacbAaeaaacbAaeaaacbAaeaaaaaaaaaaaaaaaaaaaaaabkbBbCbDbkbEbFbGbn +aaaaaaaaabaaaaaaabaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabkbkbubHbkbnbIbnbn +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbKbLbMbNbObPbJ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbQbRbSbSbTbUbJ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbJbJbJbJbJbJbJ +"} + diff --git a/polaris.dme b/polaris.dme index 54877037d5..8a4f35920b 100644 --- a/polaris.dme +++ b/polaris.dme @@ -197,6 +197,7 @@ #include "code\defines\procs\radio.dm" #include "code\defines\procs\sd_Alert.dm" #include "code\defines\procs\statistics.dm" +#include "code\game\asteroid.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" #include "code\game\base_turf.dm" @@ -340,6 +341,7 @@ #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" #include "code\game\jobs\job_controller.dm" +#include "code\game\jobs\jobprocs.dm" #include "code\game\jobs\jobs.dm" #include "code\game\jobs\whitelist.dm" #include "code\game\jobs\job\assistant.dm" @@ -658,6 +660,7 @@ #include "code\game\objects\items\weapons\gift_wrappaper.dm" #include "code\game\objects\items\weapons\handcuffs.dm" #include "code\game\objects\items\weapons\improvised_components.dm" +#include "code\game\objects\items\weapons\kitchen.dm" #include "code\game\objects\items\weapons\manuals.dm" #include "code\game\objects\items\weapons\mop.dm" #include "code\game\objects\items\weapons\mop_deploy.dm" @@ -920,6 +923,7 @@ #include "code\modules\admin\verbs\diagnostics.dm" #include "code\modules\admin\verbs\dice.dm" #include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\icarus.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\massmodvar.dm" #include "code\modules\admin\verbs\modifyvariables.dm" @@ -1315,7 +1319,6 @@ #include "code\modules\mob\living\carbon\human\human_damage.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" #include "code\modules\mob\living\carbon\human\human_movement.dm" #include "code\modules\mob\living\carbon\human\human_organs.dm" #include "code\modules\mob\living\carbon\human\human_powers.dm" diff --git a/tools/mapmerge/2clean_map.bat b/tools/mapmerge/2clean_map.bat index a719963df4..2cfd921726 100644 --- a/tools/mapmerge/2clean_map.bat +++ b/tools/mapmerge/2clean_map.bat @@ -5,4 +5,4 @@ FOR %%f IN (../../maps/*.dmm) DO ( java -jar MapPatcher.jar -clean ../../maps/%%f.backup ../../maps/%%f ../../maps/%%f ) -pause +pause \ No newline at end of file diff --git a/tools/mapmerge/clean_map_git.sh b/tools/mapmerge/clean_map_git.sh index 25cef6da93..3ede4e8d1b 100755 --- a/tools/mapmerge/clean_map_git.sh +++ b/tools/mapmerge/clean_map_git.sh @@ -1,9 +1,10 @@ -#!/bin/sh +#!/bin/bash -for MAPFILE in ../../maps/*.dmm +for i in {1..5} do - MAPNAME=$(basename $MAPFILE) - git show HEAD:maps/$MAPNAME > tmp.dmm - java -jar MapPatcher.jar -clean tmp.dmm $MAPFILE $MAPFILE + MAPFILE="polaris-$i.dmm" + + git show HEAD:maps/$MAPFILE > tmp.dmm + java -jar MapPatcher.jar -clean tmp.dmm '../../maps/'$MAPFILE '../../maps/'$MAPFILE rm tmp.dmm done