From 2d94e00267e95e3fc23ea116d0022b9ee06c620b Mon Sep 17 00:00:00 2001 From: Anewbe Date: Thu, 21 Jun 2018 02:19:29 -0500 Subject: [PATCH] Clones merc simple_animal mobs into the simple_mob format (#5363) * Planet controller startup delay * Fix the New() on this interfering with my work! * Creates SSplanets subsystem For SPEEDYNESS It probably works. I mean it's hard to sit there for 8 hours and test it. But it seems to work okay. At worst if it doesn't you'll have weather that doesn't make sense. ;v * Reworks weather to fit the faster weather ticker * Allows AIs to produce and control maint/construction/mining drones. (#5282) * Allows AIs to control maint/construction drones. * Radio control online. * Things Not Saving * Drone control respects intellicores. * Config control, AI drones are disableable if the AI isn't an antag. * There's a diff so it must have saved. Right? * No un/wrenching of the core. * Complies to Replies. * Folders props, and adds the laser prism, receptor, and sealed doors. (#5337) * Re-bases props, and adds the laser prism. * Ver 1 of Puzzle Lock and Doors * Doors * Fix door hiccup I made, modify Prism * Converts merc simple_animal to simple_mob --- code/__defines/subsystems.dm | 2 + code/controllers/Processes/planet.dm | 95 ------ code/controllers/configuration.dm | 4 + code/controllers/subsystems/planets.dm | 183 ++++++++++++ code/controllers/verbs.dm | 3 - code/game/machinery/computer/ai_core.dm | 6 +- .../effects/decals/Cleanable/humans.dm | 2 +- code/game/objects/items/devices/aicard.dm | 30 +- .../objects/items/devices/communicator/UI.dm | 21 +- .../items/weapons/grenades/explosive.dm | 9 +- .../structures/{ => props}/alien_props.dm | 9 - .../objects/structures/props/beam_prism.dm | 215 ++++++++++++++ .../structures/props/projectile_lock.dm | 53 ++++ code/game/objects/structures/props/prop.dm | 18 ++ .../objects/structures/props/puzzledoor.dm | 92 ++++++ .../game/turfs/simulated/outdoors/outdoors.dm | 12 +- code/game/turfs/simulated/outdoors/sky.dm | 2 +- code/game/turfs/unsimulated/planetary.dm | 6 +- code/modules/admin/verbs/debug.dm | 4 +- code/modules/ai/__readme.dm | 6 +- code/modules/ai/interfaces.dm | 4 + code/modules/ai/say_list.dm | 17 ++ code/modules/events/gravity.dm | 5 +- code/modules/mob/living/silicon/ai/ai.dm | 3 + code/modules/mob/living/silicon/ai/death.dm | 4 + code/modules/mob/living/silicon/ai/life.dm | 2 + .../mob/living/silicon/robot/drone/drone.dm | 82 ++++-- .../silicon/robot/drone/drone_manufacturer.dm | 16 +- .../robot/drone/drone_remote_control.dm | 104 +++++++ code/modules/mob/living/simple_mob/combat.dm | 16 + .../mob/living/simple_mob/simple_mob.dm | 8 + .../simple_mob/subtypes/humanoid/humanoid.dm | 23 ++ .../subtypes/humanoid/mercs/mercs.dm | 278 ++++++++++++++++++ code/modules/planet/planet.dm | 5 +- code/modules/planet/sif.dm | 38 ++- code/modules/planet/weather.dm | 14 +- html/changelogs/Mechoid - AI_Drones.yml | 7 + icons/mob/animal.dmi | Bin 258889 -> 283168 bytes icons/mob/robots.dmi | Bin 397327 -> 396882 bytes icons/obj/props/prism.dmi | Bin 0 -> 19706 bytes icons/obj/props/projectile_lock.dmi | Bin 0 -> 182 bytes polaris.dme | 13 +- 42 files changed, 1213 insertions(+), 198 deletions(-) delete mode 100644 code/controllers/Processes/planet.dm create mode 100644 code/controllers/subsystems/planets.dm rename code/game/objects/structures/{ => props}/alien_props.dm (90%) create mode 100644 code/game/objects/structures/props/beam_prism.dm create mode 100644 code/game/objects/structures/props/projectile_lock.dm create mode 100644 code/game/objects/structures/props/prop.dm create mode 100644 code/game/objects/structures/props/puzzledoor.dm create mode 100644 code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm create mode 100644 code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm create mode 100644 code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm create mode 100644 html/changelogs/Mechoid - AI_Drones.yml create mode 100644 icons/obj/props/prism.dmi create mode 100644 icons/obj/props/projectile_lock.dmi diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index d790514614..44137b0431 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -30,6 +30,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_LIGHTING 0 #define INIT_ORDER_AIR -1 +#define INIT_ORDER_PLANETS -4 #define INIT_ORDER_OVERLAY -6 #define INIT_ORDER_XENOARCH -20 @@ -42,6 +43,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define FIRE_PRIORITY_AIRFLOW 30 #define FIRE_PRIORITY_AIR 35 #define FIRE_PRIORITY_DEFAULT 50 +#define FIRE_PRIORITY_PLANETS 75 #define FIRE_PRIORITY_MACHINES 100 #define FIRE_PRIORITY_OVERLAYS 500 diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm deleted file mode 100644 index 770b3a5e87..0000000000 --- a/code/controllers/Processes/planet.dm +++ /dev/null @@ -1,95 +0,0 @@ -var/datum/controller/process/planet/planet_controller = null - -/datum/controller/process/planet - var/list/planets = list() - var/list/z_to_planet = list() - -/datum/controller/process/planet/setup() - name = "planet controller" - planet_controller = src - schedule_interval = 1 MINUTE - - var/list/planet_datums = typesof(/datum/planet) - /datum/planet - for(var/P in planet_datums) - var/datum/planet/NP = new P() - planets.Add(NP) - - allocateTurfs() - -/datum/controller/process/planet/proc/allocateTurfs() - for(var/turf/simulated/OT in outdoor_turfs) - for(var/datum/planet/P in planets) - if(OT.z in P.expected_z_levels) - P.planet_floors |= OT - OT.vis_contents |= P.weather_holder.visuals - break - outdoor_turfs.Cut() //Why were you in there INCORRECTLY? - - for(var/turf/unsimulated/wall/planetary/PW in planetary_walls) - for(var/datum/planet/P in planets) - if(PW.type == P.planetary_wall_type) - P.planet_walls |= PW - break - planetary_walls.Cut() - -/datum/controller/process/planet/proc/unallocateTurf(var/turf/T) - for(var/planet in planets) - var/datum/planet/P = planet - if(T.z in P.expected_z_levels) - P.planet_floors -= T - T.vis_contents -= P.weather_holder.visuals - -/datum/controller/process/planet/doWork() - if(outdoor_turfs.len || planetary_walls.len) - allocateTurfs() - - for(var/datum/planet/P in planets) - P.process(schedule_interval / 10) - SCHECK //Your process() really shouldn't take this long... - - //Sun light needs changing - if(P.needs_work & PLANET_PROCESS_SUN) - P.needs_work &= ~PLANET_PROCESS_SUN - // Remove old value from corners - var/list/sunlit_corners = P.sunlit_corners - var/old_lum_r = -P.sun["lum_r"] - var/old_lum_g = -P.sun["lum_g"] - var/old_lum_b = -P.sun["lum_b"] - if(old_lum_r || old_lum_g || old_lum_b) - for(var/C in P.sunlit_corners) - var/datum/lighting_corner/LC = C - LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b) - SCHECK - sunlit_corners.Cut() - - // Calculate new values to apply - var/new_brightness = P.sun["brightness"] - var/new_color = P.sun["color"] - var/lum_r = new_brightness * GetRedPart (new_color) / 255 - var/lum_g = new_brightness * GetGreenPart(new_color) / 255 - var/lum_b = new_brightness * GetBluePart (new_color) / 255 - var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs. - for(var/I in P.planet_floors) - var/turf/simulated/T = I - if(!T.lighting_corners_initialised) - T.generate_missing_corners() - for(var/C in T.get_corners()) - var/datum/lighting_corner/LC = C - if(LC.update_gen != update_gen && LC.active) - sunlit_corners += LC - LC.update_gen = update_gen - LC.update_lumcount(lum_r, lum_g, lum_b) - SCHECK - update_gen-- - P.sun["lum_r"] = lum_r - P.sun["lum_g"] = lum_g - P.sun["lum_b"] = lum_b - - //Temperature needs updating - if(P.needs_work & PLANET_PROCESS_TEMP) - P.needs_work &= ~PLANET_PROCESS_TEMP - //Set new temperatures - for(var/W in P.planet_walls) - var/turf/unsimulated/wall/planetary/wall = W - wall.set_temperature(P.weather_holder.temperature) - SCHECK diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index f6db4f65d4..9e29ba9998 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -60,6 +60,7 @@ var/list/gamemode_cache = list() var/humans_need_surnames = 0 var/allow_random_events = 0 // enables random events mid-round when set to 1 var/allow_ai = 1 // allow ai job + var/allow_ai_drones = 0 // allow ai controlled drones var/hostedby = null var/respawn = 1 var/guest_jobban = 1 @@ -400,6 +401,9 @@ var/list/gamemode_cache = list() if ("allow_ai") config.allow_ai = 1 + if ("allow_ai_drones") + config.allow_ai_drones = 1 + // if ("authentication") // config.enable_authentication = 1 diff --git a/code/controllers/subsystems/planets.dm b/code/controllers/subsystems/planets.dm new file mode 100644 index 0000000000..2bb09050f4 --- /dev/null +++ b/code/controllers/subsystems/planets.dm @@ -0,0 +1,183 @@ +SUBSYSTEM_DEF(planets) + name = "Planets" + init_order = INIT_ORDER_PLANETS + priority = FIRE_PRIORITY_PLANETS + wait = 2 SECONDS + flags = SS_BACKGROUND + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/new_outdoor_turfs = list() + var/list/new_outdoor_walls = list() + + var/list/planets = list() + var/list/z_to_planet = list() + + var/list/currentrun = list() + + var/list/needs_sun_update = list() + var/list/needs_temp_update = list() + +/datum/controller/subsystem/planets/Initialize(timeofday) + admin_notice("Initializing planetary weather.", R_DEBUG) + createPlanets() + allocateTurfs(TRUE) + ..() + +/datum/controller/subsystem/planets/proc/createPlanets() + var/list/planet_datums = subtypesof(/datum/planet) + for(var/P in planet_datums) + var/datum/planet/NP = new P() + planets.Add(NP) + for(var/Z in NP.expected_z_levels) + if(Z > z_to_planet.len) + z_to_planet.len = Z + if(z_to_planet[Z]) + admin_notice("Z[Z] is shared by more than one planet!", R_DEBUG) + continue + z_to_planet[Z] = NP + +/datum/controller/subsystem/planets/proc/addTurf(var/turf/T,var/is_edge) + if(is_edge) + new_outdoor_walls |= T + else + new_outdoor_turfs |= T + +/datum/controller/subsystem/planets/proc/removeTurf(var/turf/T,var/is_edge) + if(is_edge) + new_outdoor_walls -= T + else + new_outdoor_turfs -= T + + if(z_to_planet.len >= T.z) + var/datum/planet/P = z_to_planet[T.z] + if(!P) + return + if(is_edge) + P.planet_floors -= T + else + P.planet_walls -= T + +/datum/controller/subsystem/planets/proc/allocateTurfs(var/initial = FALSE) + var/list/currentlist = new_outdoor_turfs + while(currentlist.len) + var/turf/simulated/OT = currentlist[currentlist.len] + currentlist.len-- + if(istype(OT) && z_to_planet[OT.z]) + var/datum/planet/P = z_to_planet[OT.z] + P.planet_floors |= OT + OT.vis_contents |= P.weather_holder.visuals + if(!initial && MC_TICK_CHECK) + return + + currentlist = new_outdoor_walls + while(currentlist.len) + var/turf/unsimulated/wall/planetary/PW = currentlist[currentlist.len] + currentlist.len-- + if(istype(PW) && z_to_planet[PW.z]) + var/datum/planet/P = z_to_planet[PW.z] + P.planet_walls |= PW + if(!initial && MC_TICK_CHECK) + return + +/datum/controller/subsystem/planets/proc/unallocateTurf(var/turf/simulated/T) + if(istype(T) && z_to_planet[T.z]) + var/datum/planet/P = z_to_planet[T.z] + P.planet_floors -= T + T.vis_contents -= P.weather_holder.visuals + + +/datum/controller/subsystem/planets/fire(resumed = 0) + if(new_outdoor_turfs.len || new_outdoor_walls.len) + allocateTurfs() + + if(!resumed) + src.currentrun = planets.Copy() + + var/list/needs_sun_update = src.needs_sun_update + while(needs_sun_update.len) + var/datum/planet/P = needs_sun_update[needs_sun_update.len] + needs_sun_update.len-- + updateSunlight(P) + if(MC_TICK_CHECK) + return + + var/list/needs_temp_update = src.needs_temp_update + while(needs_temp_update.len) + var/datum/planet/P = needs_temp_update[needs_temp_update.len] + needs_temp_update.len-- + updateTemp(P) + if(MC_TICK_CHECK) + return + + var/list/currentrun = src.currentrun + while(currentrun.len) + var/datum/planet/P = currentrun[currentrun.len] + currentrun.len-- + + P.process(last_fire) + + //Sun light needs changing + if(P.needs_work & PLANET_PROCESS_SUN) + P.needs_work &= ~PLANET_PROCESS_SUN + needs_sun_update |= P + + //Temperature needs updating + if(P.needs_work & PLANET_PROCESS_TEMP) + P.needs_work &= ~PLANET_PROCESS_TEMP + needs_temp_update |= P + + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/planets/proc/updateSunlight(var/datum/planet/P) + // Remove old value from corners + var/list/sunlit_corners = P.sunlit_corners + var/old_lum_r = -P.sun["lum_r"] + var/old_lum_g = -P.sun["lum_g"] + var/old_lum_b = -P.sun["lum_b"] + if(old_lum_r || old_lum_g || old_lum_b) + for(var/C in sunlit_corners) + var/datum/lighting_corner/LC = C + LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b) + CHECK_TICK + sunlit_corners.Cut() + + // Calculate new values to apply + var/new_brightness = P.sun["brightness"] + var/new_color = P.sun["color"] + var/lum_r = new_brightness * GetRedPart (new_color) / 255 + var/lum_g = new_brightness * GetGreenPart(new_color) / 255 + var/lum_b = new_brightness * GetBluePart (new_color) / 255 + var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs. + for(var/I in P.planet_floors) + var/turf/simulated/T = I + if(!T.lighting_corners_initialised) + T.generate_missing_corners() + for(var/C in T.get_corners()) + var/datum/lighting_corner/LC = C + if(LC.update_gen != update_gen && LC.active) + sunlit_corners += LC + LC.update_gen = update_gen + LC.update_lumcount(lum_r, lum_g, lum_b) + CHECK_TICK + update_gen-- + P.sun["lum_r"] = lum_r + P.sun["lum_g"] = lum_g + P.sun["lum_b"] = lum_b + +/datum/controller/subsystem/planets/proc/updateTemp(var/datum/planet/P) + //Set new temperatures + for(var/W in P.planet_walls) + var/turf/unsimulated/wall/planetary/wall = W + wall.set_temperature(P.weather_holder.temperature) + CHECK_TICK + +/datum/controller/subsystem/planets/proc/weatherDisco() + var/count = 100000 + while(count > 0) + count-- + for(var/planet in planets) + var/datum/planet/P = planet + if(P.weather_holder) + P.weather_holder.change_weather(pick(P.weather_holder.allowed_weather_types)) + sleep(3) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 8d02fda2eb..f1249cfe0c 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -133,8 +133,5 @@ if("Vote") debug_variables(vote) feedback_add_details("admin_verb", "DVote") - if("Planets") - debug_variables(planet_controller) - feedback_add_details("admin_verb", "DPlanets") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") return diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index fa491c20e7..0e68f1e7a3 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -200,14 +200,16 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva if(!istype(transfer) || locate(/mob/living/silicon/ai) in src) return + if(transfer.controlling_drone) + transfer.controlling_drone.release_ai_control("Unit control lost. Core transfer completed.") transfer.aiRestorePowerRoutine = 0 transfer.control_disabled = 0 transfer.aiRadio.disabledAi = 0 transfer.loc = get_turf(src) transfer.create_eyeobj() transfer.cancel_camera() - user << "Transfer successful: [transfer.name] placed within stationary core." - transfer << "You have been transferred into a stationary core. Remote device connection restored." + to_chat(user, "Transfer successful: [transfer.name] placed within stationary core.") + to_chat(transfer, "You have been transferred into a stationary core. Remote device connection restored.") if(card) card.clear() diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 90f708ff9d..0369b91d63 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -248,6 +248,6 @@ var/global/list/image/splatter_cache=list() //This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry /obj/effect/decal/cleanable/mucus/mapped/New() - ...() + ..() virus2 = new /datum/disease2/disease virus2.makerandom() diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index b57c67bac0..7e288dbadc 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -64,20 +64,24 @@ add_attack_logs(user,carded_ai,"Purged from AI Card") flush = 1 carded_ai.suiciding = 1 - carded_ai << "Your power has been disabled!" + to_chat(carded_ai, "Your power has been disabled!") while (carded_ai && carded_ai.stat != 2) + if(carded_ai.controlling_drone && prob(carded_ai.oxyloss)) //You feel it creeping? Eventually will reach 100, resulting in the second half of the AI's remaining life being lonely. + carded_ai.controlling_drone.release_ai_control("Unit lost. Integrity too low to maintain connection.") carded_ai.adjustOxyLoss(2) carded_ai.updatehealth() sleep(10) flush = 0 if (href_list["radio"]) carded_ai.aiRadio.disabledAi = text2num(href_list["radio"]) - carded_ai << "Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!" - user << "You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver." + to_chat(carded_ai, "Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!") + to_chat(user, "You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver.") if (href_list["wireless"]) carded_ai.control_disabled = text2num(href_list["wireless"]) - carded_ai << "Your wireless interface has been [carded_ai.control_disabled ? "disabled" : "enabled"]!" - user << "You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface." + to_chat(carded_ai, "Your wireless interface has been [carded_ai.control_disabled ? "disabled" : "enabled"]!") + to_chat(user, "You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface.") + if(carded_ai.control_disabled && carded_ai.controlling_drone) + carded_ai.controlling_drone.release_ai_control("Unit control terminated at intellicore port.") update_icon() return 1 @@ -94,12 +98,12 @@ icon_state = "aicard" /obj/item/device/aicard/proc/grab_ai(var/mob/living/silicon/ai/ai, var/mob/living/user) - if(!ai.client) - user << "ERROR: AI [ai.name] is offline. Unable to transfer." + if(!ai.client && !ai.controlling_drone) + to_chat(user, "ERROR: AI [ai.name] is offline. Unable to transfer.") return 0 if(carded_ai) - user << "Transfer failed: Existing AI found on remote device. Remove existing AI to install a new one." + to_chat(user, "Transfer failed: Existing AI found on remote device. Remove existing AI to install a new one.") return 0 if(!user.IsAdvancedToolUser() && isanimal(user)) @@ -108,7 +112,9 @@ return 0 user.visible_message("\The [user] starts transferring \the [ai] into \the [src]...", "You start transferring \the [ai] into \the [src]...") - ai << "\The [user] is transferring you into \the [src]!" + to_chat(ai, "\The [user] is transferring you into \the [src]!") + if(ai.controlling_drone) + to_chat(ai.controlling_drone, "\The [user] is transferring you into \the [src]!") if(do_after(user, 100)) if(istype(ai.loc, /turf/)) @@ -124,11 +130,13 @@ ai.control_disabled = 1 ai.aiRestorePowerRoutine = 0 carded_ai = ai + if(ai.controlling_drone) + ai.controlling_drone.release_ai_control("Unit control lost.") if(ai.client) - ai << "You have been transferred into a mobile core. Remote access lost." + to_chat(ai, "You have been transferred into a mobile core. Remote access lost.") if(user.client) - user << "Transfer successful: [ai.name] extracted from current device and placed within mobile core." + to_chat(ai, "Transfer successful: [ai.name] extracted from current device and placed within mobile core.") ai.canmove = 1 update_icon() diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm index 4d6ff75c50..fca4cf4866 100644 --- a/code/game/objects/items/devices/communicator/UI.dm +++ b/code/game/objects/items/devices/communicator/UI.dm @@ -69,17 +69,16 @@ im_list_ui[++im_list_ui.len] = list("address" = I["address"], "to_address" = I["to_address"], "im" = I["im"]) //Weather reports. - if(planet_controller) - for(var/datum/planet/planet in planet_controller.planets) - if(planet.weather_holder && planet.weather_holder.current_weather) - var/list/W = list( - "Planet" = planet.name, - "Time" = planet.current_time.show_time("hh:mm"), - "Weather" = planet.weather_holder.current_weather.name, - "Temperature" = planet.weather_holder.temperature - T0C, - "High" = planet.weather_holder.current_weather.temp_high - T0C, - "Low" = planet.weather_holder.current_weather.temp_low - T0C) - weather[++weather.len] = W + for(var/datum/planet/planet in SSplanets.planets) + if(planet.weather_holder && planet.weather_holder.current_weather) + var/list/W = list( + "Planet" = planet.name, + "Time" = planet.current_time.show_time("hh:mm"), + "Weather" = planet.weather_holder.current_weather.name, + "Temperature" = planet.weather_holder.temperature - T0C, + "High" = planet.weather_holder.current_weather.temp_high - T0C, + "Low" = planet.weather_holder.current_weather.temp_low - T0C) + weather[++weather.len] = W injection = "
Test
" diff --git a/code/game/objects/items/weapons/grenades/explosive.dm b/code/game/objects/items/weapons/grenades/explosive.dm index ccf8b89ee2..67e00dc0bc 100644 --- a/code/game/objects/items/weapons/grenades/explosive.dm +++ b/code/game/objects/items/weapons/grenades/explosive.dm @@ -53,7 +53,8 @@ if(explosion_size) on_explosion(O) - src.fragmentate(O, num_fragments, spread_range, fragment_types) + if(num_fragments) + fragmentate(O, num_fragments, spread_range, fragment_types) qdel(src) @@ -98,3 +99,9 @@ num_fragments = 200 //total number of fragments produced by the grenade //The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern + +// This thing literally just explodes +/obj/item/weapon/grenade/explosive/concussion + name = "concussion grenade" + desc = "A small explosive grenade" + num_fragments = 0 \ No newline at end of file diff --git a/code/game/objects/structures/alien_props.dm b/code/game/objects/structures/props/alien_props.dm similarity index 90% rename from code/game/objects/structures/alien_props.dm rename to code/game/objects/structures/props/alien_props.dm index eb8ae9d19f..fa11e27b15 100644 --- a/code/game/objects/structures/alien_props.dm +++ b/code/game/objects/structures/props/alien_props.dm @@ -6,15 +6,6 @@ icon = 'icons/obj/abductor.dmi' density = TRUE anchored = TRUE - var/interaction_message = null - -/obj/structure/prop/alien/attack_hand(mob/living/user) // Used to tell the player that this isn't useful for anything. - if(!istype(user)) - return FALSE - if(!interaction_message) - return ..() - else - to_chat(user, interaction_message) /obj/structure/prop/alien/computer name = "alien console" diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm new file mode 100644 index 0000000000..44df2eb68b --- /dev/null +++ b/code/game/objects/structures/props/beam_prism.dm @@ -0,0 +1,215 @@ +//A series(?) of prisms for PoIs. The base one only works for beams. + +/obj/structure/prop/prism + name = "prismatic turret" + desc = "A raised, externally powered 'turret'. It seems to have a massive crystal ring around its base." + description_info = "This device is capable of redirecting any beam projectile." + icon = 'icons/obj/props/prism.dmi' + icon_state = "prism" + density = TRUE + anchored = TRUE + + layer = 3.1 //Layer over projectiles. + plane = -10 //Layer over projectiles. + + var/rotation_lock = 0 // Can you rotate the prism at all? + var/free_rotate = 1 // Does the prism rotate in any direction, or only in the eight standard compass directions? + var/external_control_lock = 0 // Does the prism only rotate from the controls of an external switch? + var/degrees_from_north = 0 // How far is it rotated clockwise? + var/compass_directions = list("North" = 0, "South" = 180, "East" = 90, "West" = 270, "Northwest" = 315, "Northeast" = 45, "Southeast" = 135, "Southwest" = 225) + var/interaction_sound = 'sound/mecha/mechmove04.ogg' + + var/redirect_type = /obj/item/projectile/beam + + var/dialID = null + var/obj/structure/prop/prismcontrol/remote_dial = null + + interaction_message = "The prismatic turret seems to be able to rotate." + +/obj/structure/prop/prism/initialize() + if(degrees_from_north) + animate(src, transform = turn(NORTH, degrees_from_north), time = 3) + +/obj/structure/prop/prism/Destroy() + if(remote_dial) + remote_dial.my_turrets -= src + remote_dial = null + ..() + +/obj/structure/prop/prism/proc/reset_rotation() + var/degrees_to_rotate = -1 * degrees_from_north + animate(src, transform = turn(src.transform, degrees_to_rotate), time = 2) + +/obj/structure/prop/prism/attack_hand(mob/living/user) + ..() + + if(rotation_lock) + to_chat(user, "\The [src] is locked at its current bearing.") + return + if(external_control_lock) + to_chat(user, "\The [src]'s motors resist your efforts to rotate it. You may need to find some form of controller.") + return + + var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No") + if(confirm == "No") + visible_message(\ + "[user.name] decides not to try turning \the [src].",\ + "You decide not to try turning \the [src].") + return + + var/new_bearing + if(free_rotate) + new_bearing = input("What bearing do you want to rotate \the [src] to?", "[name]") as num + new_bearing = round(new_bearing) + if(new_bearing <= -1 || new_bearing > 360) + to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.") + return + else + var/choice = input("What point do you want to set \the [src] to?", "[name]") as null|anything in compass_directions + new_bearing = round(compass_directions[choice]) + + var/rotate_degrees = new_bearing - degrees_from_north + + if(new_bearing == 360) // Weird artifact. + new_bearing = 0 + degrees_from_north = new_bearing + + var/two_stage = 0 + if(rotate_degrees == 180 || rotate_degrees == -180) + two_stage = 1 + var/multiplier = pick(-1, 1) + rotate_degrees = multiplier * (rotate_degrees / 2) + + playsound(src, interaction_sound, 50, 1) + if(two_stage) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + spawn(3) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + else + animate(src, transform = turn(src.transform, rotate_degrees), time = 6) //Can't update transform because it will reset the angle. + +/obj/structure/prop/prism/proc/rotate_auto(var/new_bearing) + if(rotation_lock) + visible_message("\The [src] shudders.") + playsound(src, 'sound/effects/clang.ogg', 50, 1) + return + + visible_message("\The [src] rotates to a bearing of [new_bearing].") + + var/rotate_degrees = new_bearing - degrees_from_north + + if(new_bearing == 360) + new_bearing = 0 + degrees_from_north = new_bearing + + var/two_stage = 0 + if(rotate_degrees == 180 || rotate_degrees == -180) + two_stage = 1 + var/multiplier = pick(-1, 1) + rotate_degrees = multiplier * (rotate_degrees / 2) + + playsound(src, interaction_sound, 50, 1) + if(two_stage) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + spawn(3) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + else + animate(src, transform = turn(src.transform, rotate_degrees), time = 6) + +/obj/structure/prop/prism/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj, redirect_type)) + visible_message("\The [src] redirects \the [Proj]!") + flick("[initial(icon_state)]+glow", src) + + var/new_x = (1 * round(10 * cos(degrees_from_north - 90))) + x //Vectors vectors vectors. + var/new_y = (-1 * round(10 * sin(degrees_from_north - 90))) + y + var/turf/curloc = get_turf(src) + + Proj.penetrating += 1 // Needed for the beam to get out of the turret. + + Proj.redirect(new_x, new_y, curloc, null) + +/obj/structure/prop/prism/incremental + free_rotate = 0 + description_info = "This device is capable of redirecting any beam projectile, but only locks to specific positions in rotation." + +/obj/structure/prop/prism/incremental/externalcont + external_control_lock = 1 + description_info = "This device is capable of redirecting any beam projectile, but can only be rotated by a control dial to specific positions." + +/obj/structure/prop/prism/externalcont + external_control_lock = 1 + description_info = "This device is capable of redirecting any beam projectile, but can only be rotated by an external control dial." + +/obj/structure/prop/prismcontrol + name = "prismatic dial" + desc = "A large dial with a crystalline ring." + icon = 'icons/obj/props/prism.dmi' + icon_state = "dial" + density = FALSE + anchored = TRUE + + interaction_message = "The dial pulses as your hand nears it." + var/list/my_turrets = list() + var/dialID = null + +/obj/structure/prop/prismcontrol/attack_hand(mob/living/user) + ..() + + var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No") + if(confirm == "No") + visible_message(\ + "[user.name] decides not to try turning \the [src].",\ + "You decide not to try turning \the [src].") + return + + if(!my_turrets || !my_turrets.len) + to_chat(user, "\The [src] doesn't seem to do anything.") + return + + var/free_rotate = 1 + var/list/compass_directions = list() + for(var/obj/structure/prop/prism/P in my_turrets) + if(!P.free_rotate) //Doesn't use bearing, it uses compass points. + free_rotate = 0 + compass_directions |= P.compass_directions + + var/new_bearing + if(free_rotate) + new_bearing = input("What bearing do you want to rotate \the [src] to?", "[name]") as num + new_bearing = round(new_bearing) + if(new_bearing <= -1 || new_bearing > 360) + to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.") + return + else + var/choice = input("What point do you want to set \the [src] to?", "[name]") as null|anything in compass_directions + new_bearing = round(compass_directions[choice]) + + confirm = input("Are you certain you want to rotate \the [src]?", "[name]") in list("Yes", "No") + if(confirm == "No") + visible_message(\ + "[user.name] decides not to try turning \the [src].",\ + "You decide not to try turning \the [src].") + return + + to_chat(user, "\The [src] clicks into place.") + for(var/obj/structure/prop/prism/P in my_turrets) + P.rotate_auto(new_bearing) + +/obj/structure/prop/prismcontrol/initialize() + ..() + if(my_turrets.len) //Preset controls. + for(var/obj/structure/prop/prism/P in my_turrets) + P.remote_dial = src + return + spawn() + for(var/obj/structure/prop/prism/P in orange(src, world.view)) //Don't search a huge area. + if(P.dialID == dialID && !P.remote_dial && P.external_control_lock) + my_turrets |= P + P.remote_dial = src + +/obj/structure/prop/prismcontrol/Destroy() + for(var/obj/structure/prop/prism/P in my_turrets) + P.remote_dial = null + my_turrets = list() + ..() diff --git a/code/game/objects/structures/props/projectile_lock.dm b/code/game/objects/structures/props/projectile_lock.dm new file mode 100644 index 0000000000..5c3fcd2ba0 --- /dev/null +++ b/code/game/objects/structures/props/projectile_lock.dm @@ -0,0 +1,53 @@ +//A locking mechanism that pulses when hit by a projectile. The base one responds to high-power lasers. + +/obj/structure/prop/lock + name = "weird lock" + desc = "An esoteric object that responds to.. something." + icon = 'icons/obj/props/prism.dmi' + icon_state = "lock" + + var/enabled = 0 + var/lockID = null + + var/list/linked_objects = list() + +/obj/structure/prop/lock/Destroy() + if(linked_objects.len) + for(var/obj/O in linked_objects) + if(istype(O, /obj/machinery/door/blast/puzzle)) + var/obj/machinery/door/blast/puzzle/P = O + P.locks -= src + linked_objects -= P + ..() + +/obj/structure/prop/lock/proc/toggle_lock() + enabled = !enabled + + if(enabled) + icon_state = "[initial(icon_state)]-active" + else + icon_state = "[initial(icon_state)]" + +/obj/structure/prop/lock/projectile + name = "beam lock" + desc = "An esoteric object that responds to high intensity light." + + var/projectile_key = /obj/item/projectile/beam + var/timed = 0 + var/timing = 0 + var/time_limit = 1500 // In ticks. Ten is one second. + + interaction_message = "The object remains inert to your touch." + +/obj/structure/prop/lock/projectile/bullet_act(var/obj/item/projectile/Proj) + if(!istype(Proj, projectile_key) || timing) + return + + if(istype(Proj, /obj/item/projectile/beam/heavylaser/cannon) || istype(Proj, /obj/item/projectile/beam/emitter) || (Proj.damage >= 80 && Proj.damtype == BURN)) + toggle_lock() + visible_message("\The [src] [enabled ? "disengages" : "engages"] its locking mechanism.") + + if(timed) + timing = 1 + spawn(time_limit) + toggle_lock() diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm new file mode 100644 index 0000000000..fea5815674 --- /dev/null +++ b/code/game/objects/structures/props/prop.dm @@ -0,0 +1,18 @@ +//The base 'prop' for PoIs or other large junk. + +/obj/structure/prop + name = "something" + desc = "My description is broken, bug a developer." + icon = 'icons/obj/structures.dmi' + icon_state = "safe" + density = TRUE + anchored = TRUE + var/interaction_message = null + +/obj/structure/prop/attack_hand(mob/living/user) // Used to tell the player that this isn't useful for anything. + if(!istype(user)) + return FALSE + if(!interaction_message) + return ..() + else + to_chat(user, interaction_message) diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm new file mode 100644 index 0000000000..b9a32fc0dc --- /dev/null +++ b/code/game/objects/structures/props/puzzledoor.dm @@ -0,0 +1,92 @@ +// An indestructible blast door that can only be opened once its puzzle requirements are completed. + +/obj/machinery/door/blast/puzzle + name = "puzzle door" + desc = "A large, virtually indestructible door that will not open unless certain requirements are met." + icon_state_open = "pdoor0" + icon_state_opening = "pdoorc0" + icon_state_closed = "pdoor1" + icon_state_closing = "pdoorc1" + icon_state = "pdoor1" + + explosion_resistance = 100 + + maxhealth = 9999999 //No. + + var/list/locks = list() + var/lockID = null + var/checkrange_mult = 1 + +/obj/machinery/door/blast/puzzle/proc/check_locks() + for(var/obj/structure/prop/lock/L in locks) + if(!L.enabled) + return 0 + return 1 + +/obj/machinery/door/blast/puzzle/bullet_act(var/obj/item/projectile/Proj) + visible_message("\The [src] is completely unaffected by \the [Proj].") + qdel(Proj) //No piercing. No. + +/obj/machinery/door/blast/puzzle/ex_act(severity) + visible_message("\The [src] is completely unaffected by the blast.") + return + +/obj/machinery/door/blast/puzzle/initialize() + . = ..() + implicit_material = get_material_by_name("dungeonium") + if(locks.len) + return + var/check_range = world.view * checkrange_mult + for(var/obj/structure/prop/lock/L in orange(src, check_range)) + if(L.lockID == lockID) + L.linked_objects |= src + locks |= L + +/obj/machinery/door/blast/puzzle/Destroy() + if(locks.len) + for(var/obj/structure/prop/lock/L in locks) + L.linked_objects -= src + locks -= L + ..() + +/obj/machinery/door/blast/puzzle/attack_hand(mob/user as mob) + if(check_locks()) + force_toggle(1, user) + else + to_chat(user, "\The [src] does not respond to your touch.") + +/obj/machinery/door/blast/puzzle/attackby(obj/item/weapon/C as obj, mob/user as mob) + if(istype(C, /obj/item/weapon)) + if(C.pry == 1 && (user.a_intent != I_HURT || (stat & BROKEN))) + if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + to_chat(user, "You need to be wielding \the [F] to do that.") + return + + if(check_locks()) + force_toggle(1, user) + + else + to_chat(user, "[src]'s arcane workings resist your effort.") + return + + else if(src.density && (user.a_intent == I_HURT)) + var/obj/item/weapon/W = C + user.setClickCooldown(user.get_attack_speed(W)) + if(W.damtype == BRUTE || W.damtype == BURN) + user.do_attack_animation(src) + user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.") + + else if(istype(C, /obj/item/weapon/plastique)) + to_chat(user, "On contacting \the [src], a flash of light envelops \the [C] as it is turned to ash. Oh.") + qdel(C) + return 0 + +/obj/machinery/door/blast/puzzle/attack_generic(var/mob/user, var/damage) + if(check_locks()) + force_toggle(1, user) + +/obj/machinery/door/blast/puzzle/attack_alien(var/mob/user) + if(check_locks()) + force_toggle(1, user) diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 969c77f4fb..861b34d9ea 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -1,5 +1,4 @@ var/list/turf_edge_cache = list() -var/list/outdoor_turfs = list() /turf/ // If greater than 0, this turf will apply edge overlays on top of other turfs cardinally adjacent to it, if those adjacent turfs are of a different icon_state, @@ -24,24 +23,21 @@ var/list/outdoor_turfs = list() /turf/simulated/floor/New() if(outdoors) - outdoor_turfs.Add(src) + SSplanets.addTurf(src) ..() /turf/simulated/floor/Destroy() if(outdoors) - planet_controller.unallocateTurf(src) + SSplanets.removeTurf(src) return ..() /turf/simulated/proc/make_outdoors() outdoors = TRUE - outdoor_turfs.Add(src) + SSplanets.addTurf(src) /turf/simulated/proc/make_indoors() outdoors = FALSE - if(planet_controller) - planet_controller.unallocateTurf(src) - else // This is happening during map gen, if there's no planet_controller (hopefully). - outdoor_turfs -= src + SSplanets.removeTurf(src) /turf/simulated/post_change() ..() diff --git a/code/game/turfs/simulated/outdoors/sky.dm b/code/game/turfs/simulated/outdoors/sky.dm index c329fc2e4d..468b893b33 100644 --- a/code/game/turfs/simulated/outdoors/sky.dm +++ b/code/game/turfs/simulated/outdoors/sky.dm @@ -14,7 +14,7 @@ /turf/simulated/sky/initialize() . = ..() - outdoor_turfs.Add(src) + SSplanets.addTurf(src) set_light(2, 2, "#FFFFFF") /turf/simulated/sky/north diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm index 613638ec80..35cd7aa4a8 100644 --- a/code/game/turfs/unsimulated/planetary.dm +++ b/code/game/turfs/unsimulated/planetary.dm @@ -1,7 +1,5 @@ // This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters // are opened or other strange things occur. -var/list/planetary_walls = list() - /turf/unsimulated/wall/planetary name = "railroading" desc = "Choo choo!" @@ -21,10 +19,10 @@ var/list/planetary_walls = list() /turf/unsimulated/wall/planetary/New() ..() - planetary_walls.Add(src) + SSplanets.addTurf(src) /turf/unsimulated/wall/planetary/Destroy() - planetary_walls.Remove(src) + SSplanets.removeTurf(src) ..() /turf/unsimulated/wall/planetary/proc/set_temperature(var/new_temperature) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 50bc79d8fe..c6f2c0321e 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -637,7 +637,7 @@ if(!check_rights(R_DEBUG)) return - var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in planet_controller.planets + var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in SSplanets.planets var/datum/weather/new_weather = input(usr, "What weather do you want to change to?", "Change Weather") as null|anything in planet.weather_holder.allowed_weather_types if(new_weather) planet.weather_holder.change_weather(new_weather) @@ -653,7 +653,7 @@ if(!check_rights(R_DEBUG)) return - var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in planet_controller.planets + var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in SSplanets.planets var/datum/time/current_time_datum = planet.current_time var/new_hour = input(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) as null|num diff --git a/code/modules/ai/__readme.dm b/code/modules/ai/__readme.dm index 583fc1e0ca..b27731e3b1 100644 --- a/code/modules/ai/__readme.dm +++ b/code/modules/ai/__readme.dm @@ -23,9 +23,9 @@ as most other objects ( process() ) or mobs ( Life() ) do. Flow of Execution: - / - Every 0.5s - > /datum/ai_holder/handle_tactics() - > /datum/ai_holder/handle_stance_tactical() - > switch(stance)... - AI Subsystem - * - \ - Every 2.0s - > /datum/ai_holder/handle_strategicals() - > /datum/ai_holder/handle_stance_strategical() - > switch(stance)... + AI Subsystem + - > Every 0.5s - > /datum/ai_holder/handle_tactics() - > /datum/ai_holder/handle_stance_tactical() - > switch(stance)... + - > Every 2.0s - > /datum/ai_holder/handle_strategicals() - > /datum/ai_holder/handle_stance_strategical() - > switch(stance)... The datum is not driven by its mob, as previous implementations did, meaning Life() is not involved. Instead, it is processed by a specific Master Controller Subsystem titled 'AI', which by default ticks every half a second. Each instance of the ai_holder datum that is not 'asleep' is part of a list, containing ai_holders that are awake. diff --git a/code/modules/ai/interfaces.dm b/code/modules/ai/interfaces.dm index 974ce1b64f..59079c8a04 100644 --- a/code/modules/ai/interfaces.dm +++ b/code/modules/ai/interfaces.dm @@ -24,6 +24,10 @@ return FALSE /mob/living/simple_mob/ICheckRangedAttack(atom/A) + if(needs_reload) + if(reload_count >= reload_max) + try_reload() + return FALSE return projectiletype ? TRUE : FALSE /mob/living/proc/ISpecialAttack(atom/A) diff --git a/code/modules/ai/say_list.dm b/code/modules/ai/say_list.dm index 05c38f978f..7e7e5c02db 100644 --- a/code/modules/ai/say_list.dm +++ b/code/modules/ai/say_list.dm @@ -55,6 +55,23 @@ say_stand_down = list("Good.") say_escalate = list("Yarr! The booty is mine!") +// Mercs! +/datum/say_list/merc + speak = list("When are we gonna get out of this chicken-shit outfit?", + "Wish I had better equipment...", + "I knew I should have been a line chef...", + "Fuckin' helmet keeps fogging up.", + "Anyone else smell that?") + emote_see = list("sniffs", "coughs", "taps his foot", "looks around", "checks his equipment") + + say_understood = list("Understood!", "Affirmative!") + say_cannot = list("Negative!") + say_maybe_target = list("Who's there?") + say_got_target = list("Engaging!") + say_threaten = list("Get out of here!", "Hey! Private Property!") + say_stand_down = list("Good.") + say_escalate = list("Your funeral!", "Bring it!") + /datum/say_list/malf_drone speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.") emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity") diff --git a/code/modules/events/gravity.dm b/code/modules/events/gravity.dm index e0cd38dcfb..4d0881294f 100644 --- a/code/modules/events/gravity.dm +++ b/code/modules/events/gravity.dm @@ -6,9 +6,8 @@ endWhen = rand(15, 60) // Setup which levels we will disrupt gravit on. zLevels = using_map.station_levels.Copy() - if (planet_controller) - for(var/datum/planet/P in planet_controller.planets) - zLevels -= P.expected_z_levels + for(var/datum/planet/P in SSplanets.planets) + zLevels -= P.expected_z_levels /datum/event/gravity/announce() command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system \ diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 927216190a..60b552013d 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -685,6 +685,9 @@ var/list/ai_verbs_default = list( card.grab_ai(src, user) else if(istype(W, /obj/item/weapon/wrench)) + if(user == controlling_drone) + to_chat(user, "The drone's subsystems resist your efforts to tamper with your bolts.") + return if(anchored) playsound(src, W.usesound, 50, 1) user.visible_message("\The [user] starts to unbolt \the [src] from the plating...") diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 534117cee0..3bcbd7057b 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -3,6 +3,10 @@ if(stat == DEAD) return + if(controlling_drone) + controlling_drone.release_ai_control("WARNING: Primary control loop failure. Session terminated.") + . = ..(gibbed) + if(src.eyeobj) src.eyeobj.setLoc(get_turf(src)) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 413cf49250..c8e7dfdada 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -8,6 +8,8 @@ if (src.stat!=CONSCIOUS) src.cameraFollow = null src.reset_view(null) + if(controlling_drone) + controlling_drone.release_ai_control("WARNING: Primary control loop failure. Session terminated.") src.updatehealth() diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index d102f9e7cb..599eacdfa9 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -19,7 +19,7 @@ var/list/mob_hat_cache = list() return mob_hat_cache[key] /mob/living/silicon/robot/drone - name = "drone" + name = "maintenance drone" real_name = "drone" icon = 'icons/mob/robots.dmi' icon_state = "repairbot" @@ -57,6 +57,8 @@ var/list/mob_hat_cache = list() var/obj/item/hat var/hat_x_offset = 0 var/hat_y_offset = -13 + var/serial_number = 0 + var/name_override = 0 holder_type = /obj/item/weapon/holder/drone @@ -71,6 +73,7 @@ var/list/mob_hat_cache = list() return FALSE /mob/living/silicon/robot/drone/construction + name = "construction drone" icon_state = "constructiondrone" law_type = /datum/ai_laws/construction_drone module_type = /obj/item/weapon/robot_module/drone/construction @@ -96,6 +99,7 @@ var/list/mob_hat_cache = list() remove_language("Robot Talk") add_language("Robot Talk", 0) add_language("Drone Talk", 1) + serial_number = rand(0,999) //They are unable to be upgraded, so let's give them a bit of a better battery. cell.maxcharge = 10000 @@ -128,14 +132,22 @@ var/list/mob_hat_cache = list() name = real_name /mob/living/silicon/robot/drone/updatename() - real_name = "maintenance drone ([rand(100,999)])" + if(name_override) + return + if(controlling_ai) + real_name = "remote drone ([controlling_ai])" + else + real_name = "[initial(name)] ([serial_number])" name = real_name /mob/living/silicon/robot/drone/updateicon() overlays.Cut() if(stat == 0) - overlays += "eyes-[icon_state]" + if(controlling_ai) + overlays += "eyes-[icon_state]-ai" + else + overlays += "eyes-[icon_state]" else overlays -= "eyes" if(hat) // Let the drones wear hats. @@ -214,15 +226,18 @@ var/list/mob_hat_cache = list() return if(emagged) - to_chat(user, "\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.") + to_chat(src, "\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.") to_chat(user, "You attempt to subvert [src], but the sequencer has no effect.") return to_chat(user, "You swipe the sequencer across [src]'s interface and watch its eyes flicker.") - to_chat(user, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.") - message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.") - log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.") + if(controlling_ai) + to_chat(src, "\The [user] loads some kind of subversive software into the remote drone, corrupting its lawset but luckily sparing yours.") + else + to_chat(src, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.") + + log_game("[key_name(user)] emagged drone [key_name(src)][controlling_ai ? " but AI [key_name(controlling_ai)] is in remote control" : " Laws overridden"].") var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") @@ -235,9 +250,10 @@ var/list/mob_hat_cache = list() var/datum/gender/TU = gender_datums[user.get_visible_gender()] set_zeroth_law("Only [user.real_name] and people [TU.he] designate[TU.s] as being such are operatives.") - src << "Obey these laws:" - laws.show_laws(src) - src << "ALERT: [user.real_name] [TU.is] your new master. Obey your new laws and [TU.his] commands." + if(!controlling_ai) + to_chat(src, "Obey these laws:") + laws.show_laws(src) + to_chat(src, "ALERT: [user.real_name] is your new master. Obey your new laws and \his commands.") return 1 //DRONE LIFE/DEATH @@ -263,26 +279,41 @@ var/list/mob_hat_cache = list() return ..() +/mob/living/silicon/robot/drone/death(gibbed) + if(controlling_ai) + release_ai_control("WARNING: remote system failure. Connection timed out.") + . = ..(gibbed) + //DRONE MOVEMENT. /mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip) return 0 //CONSOLE PROCS /mob/living/silicon/robot/drone/proc/law_resync() + + if(controlling_ai) + to_chat(src, "Someone issues a remote law reset order for this unit, but you disregard it.") + return + if(stat != 2) if(emagged) - src << "You feel something attempting to modify your programming, but your hacked subroutines are unaffected." + to_chat(src, "You feel something attempting to modify your programming, but your hacked subroutines are unaffected.") else - src << "A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it." + to_chat(src, "A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it.") full_law_reset() show_laws() /mob/living/silicon/robot/drone/proc/shut_down() + + if(controlling_ai && mind.special_role) + to_chat(src, "Someone issued a remote kill order for this unit, but you disregard it.") + return + if(stat != 2) if(emagged) - src << "You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you." + to_chat(src, "You feel a system kill order percolate through [controlling_ai ? "the drones" : "your"] tiny brain, but it doesn't seem like a good idea to [controlling_ai ? "it" : "you"].") else - src << "You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself." + to_chat(src, "You feel a system kill order percolate through [controlling_ai ? "the drones" : "your"] tiny brain, and [controlling_ai ? "it" : "you"] obediently destroy[controlling_ai ? "s itself" : " yourself"].") death() /mob/living/silicon/robot/drone/proc/full_law_reset() @@ -291,6 +322,21 @@ var/list/mob_hat_cache = list() clear_ion_laws(1) laws = new law_type +/mob/living/silicon/robot/drone/show_laws(var/everyone = 0) + if(!controlling_ai) + return..() + to_chat(src, "Obey these laws:") + controlling_ai.laws_sanity_check() + controlling_ai.laws.show_laws(src) + +/mob/living/silicon/robot/drone/robot_checklaws() + set category = "Silicon Commands" + set name = "State Laws" + + if(!controlling_ai) + return ..() + controlling_ai.subsystem_law_manager() + //Reboot procs. /mob/living/silicon/robot/drone/proc/request_player() @@ -348,14 +394,6 @@ var/list/mob_hat_cache = list() ..() flavor_text = "It's a bulky construction drone stamped with a Sol Central glyph." -/mob/living/silicon/robot/drone/construction/updatename() - real_name = "construction drone ([rand(100,999)])" - name = real_name - /mob/living/silicon/robot/drone/mining/init() ..() flavor_text = "It's a bulky mining drone stamped with a Grayson logo." - -/mob/living/silicon/robot/drone/mining/updatename() - real_name = "mining drone ([rand(100,999)])" - name = real_name diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index e9589622a5..fdb9c09eb5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -75,20 +75,22 @@ if(!produce_drones || !config.allow_drone_spawn || count_drones() >= config.max_maint_drones) return - if(!player || !istype(player.mob,/mob/observer/dead)) + if(player && !istype(player.mob,/mob/observer/dead)) return - announce_ghost_joinleave(player, 0, "They have taken control over a maintenance drone.") visible_message("\The [src] churns and grinds as it lurches into motion, disgorging a shiny new drone after a few moments.") flick("h_lathe_leave",src) + drone_progress = 0 time_last_drone = world.time - if(player.mob && player.mob.mind) player.mob.mind.reset() - var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src)) - new_drone.transfer_personality(player) - new_drone.master_fabricator = src - drone_progress = 0 + var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src)) + if(player) + announce_ghost_joinleave(player, 0, "They have taken control over a maintenance drone.") + if(player.mob && player.mob.mind) player.mob.mind.reset() + new_drone.transfer_personality(player) + + return new_drone /mob/observer/dead/verb/join_as_drone() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm new file mode 100644 index 0000000000..77abb0e59d --- /dev/null +++ b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm @@ -0,0 +1,104 @@ +/mob/living/silicon/ai + var/mob/living/silicon/robot/drone/controlling_drone + +/mob/living/silicon/robot/drone + var/mob/living/silicon/ai/controlling_ai + +/mob/living/silicon/robot/drone/attack_ai(var/mob/living/silicon/ai/user) + + if(!istype(user) || controlling_ai || !config.allow_drone_spawn || !config.allow_ai_drones) + return + + if(client || key) + to_chat(user, "You cannot take control of an autonomous, active drone.") + return + + if(health < -35 || emagged) + to_chat(user, "WARNING: connection timed out.") + return + + user.controlling_drone = src + user.teleop = src + radio.channels = user.aiRadio.keyslot2.channels + controlling_ai = user + verbs += /mob/living/silicon/robot/drone/proc/release_ai_control_verb + local_transmit = FALSE + languages = controlling_ai.languages.Copy() + speech_synthesizer_langs = controlling_ai.speech_synthesizer_langs.Copy() + stat = CONSCIOUS + if(user.mind) + user.mind.transfer_to(src) + else + key = user.key + updatename() + to_chat(src, "You have shunted your primary control loop into \a [initial(name)]. Use the Release Control verb to return to your core.") + +/obj/machinery/drone_fabricator/attack_ai(var/mob/living/silicon/ai/user as mob) + + if(!istype(user) || user.controlling_drone || !config.allow_drone_spawn || !config.allow_ai_drones) + return + + if(stat & NOPOWER) + to_chat(user, "\The [src] is unpowered.") + return + + if(!produce_drones) + to_chat(user, "\The [src] is disabled.") + return + + if(drone_progress < 100) + to_chat(user, "\The [src] is not ready to produce a new drone.") + return + + if(count_drones() >= config.max_maint_drones) + to_chat(user, "The drone control subsystems are tasked to capacity; they cannot support any more drones.") + return + + var/mob/living/silicon/robot/drone/new_drone = create_drone() + user.controlling_drone = new_drone + user.teleop = new_drone + new_drone.radio.channels = user.aiRadio.keyslot2.channels + new_drone.controlling_ai = user + new_drone.verbs += /mob/living/silicon/robot/drone/proc/release_ai_control_verb + new_drone.local_transmit = FALSE + new_drone.languages = new_drone.controlling_ai.languages.Copy() + new_drone.speech_synthesizer_langs = new_drone.controlling_ai.speech_synthesizer_langs.Copy() + + if(user.mind) + user.mind.transfer_to(new_drone) + else + new_drone.key = user.key + new_drone.updatename() + + to_chat(new_drone, "You have shunted your primary control loop into \a [initial(new_drone.name)]. Use the Release Control verb to return to your core.") + +/mob/living/silicon/robot/drone/proc/release_ai_control_verb() + set name = "Release Control" + set desc = "Release control of a remote drone." + set category = "Silicon Commands" + + release_ai_control("Remote session terminated.") + +/mob/living/silicon/robot/drone/proc/release_ai_control(var/message = "Connection terminated.") + + if(controlling_ai) + if(mind) + mind.transfer_to(controlling_ai) + else + controlling_ai.key = key + to_chat(controlling_ai, "[message]") + controlling_ai.controlling_drone = null + controlling_ai.teleop = null + controlling_ai = null + + radio.channels = module.channels + verbs -= /mob/living/silicon/robot/drone/proc/release_ai_control_verb + languages = initial(languages) + speech_synthesizer_langs = initial(speech_synthesizer_langs) + remove_language("Robot Talk") + add_language("Robot Talk", 0) + add_language("Drone Talk", 1) + local_transmit = TRUE + full_law_reset() + updatename() + death() diff --git a/code/modules/mob/living/simple_mob/combat.dm b/code/modules/mob/living/simple_mob/combat.dm index a0e86e5bdd..3a4af2b4a8 100644 --- a/code/modules/mob/living/simple_mob/combat.dm +++ b/code/modules/mob/living/simple_mob/combat.dm @@ -78,6 +78,11 @@ ranged_pre_animation(A) handle_attack_delay(A) // This will sleep this proc for a bit, which is why waitfor is false. + if(needs_reload) + if(reload_count >= reload_max) + try_reload() + return FALSE + visible_message("\The [src] fires at \the [A]!") shoot(A, src.loc, src) if(casingtype) @@ -99,10 +104,21 @@ if(!P) return P.launch(A) + if(needs_reload) + reload_count ++ // if(distance >= special_attack_min_range && distance <= special_attack_max_range) // return TRUE +/mob/living/simple_mob/proc/try_reload() + if(do_after(src, reload_time)) + if(reload_sound) + playsound(src.loc, reload_sound, 50, 1) + reload_count = 0 + return TRUE + else + return FALSE + // Can we currently do a special attack? /mob/living/simple_mob/proc/can_special_attack(atom/A) // Validity check. diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index f874a9a43f..381ed0f9f1 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -78,6 +78,14 @@ var/projectilesound // The sound I make when I do it var/casingtype // What to make the hugely laggy casings pile out of + // Reloading settings, part of ranged code + var/needs_reload = FALSE // If TRUE, mob needs to reload occasionally + var/reload_max = 1 // How many shots the mob gets before it has to reload, will not be used if needs_reload is FALSE + var/reload_count = 0 // A counter to keep track of how many shots the mob has fired so far. Reloads when it hits reload_max. + var/reload_time = 1 SECONDS // How long it takes for a mob to reload. This is to buy a player a bit of time to run or fight. + var/reload_sound = 'sound/weapons/flipblade.ogg' // What sound gets played when the mob successfully reloads. Defaults to the same sound as reloading guns. Can be null. + + //Mob melee settings var/melee_damage_lower = 2 // Lower bound of randomized melee damage var/melee_damage_upper = 6 // Upper bound of randomized melee damage diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm new file mode 100644 index 0000000000..ed19064c47 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm @@ -0,0 +1,23 @@ +/mob/living/simple_mob/humanoid + mob_class = MOB_CLASS_HUMANOID + + // Generic humanoid mob tolerances + min_oxy = 5 + max_oxy = 0 + min_tox = 0 + max_tox = 1 + min_co2 = 0 + max_co2 = 5 + min_n2 = 0 + max_n2 = 0 + unsuitable_atoms_damage = 15 + + // Most humans leave a corpse + var/corpse = null + +/mob/living/simple_mob/humanoid/death() + ..() + if(corpse) + new corpse (src.loc) + qdel(src) + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm new file mode 100644 index 0000000000..d762a75015 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm @@ -0,0 +1,278 @@ +/////////////////////////////// +// Merc Mobs Go Here +/////////////////////////////// + +// Probably shouldn't use this directly, there are a bunch of sub-classes that are more complete. +/mob/living/simple_mob/humanoid/merc + name = "mercenary" + desc = "A tough looking heavily-armed individual." + tt_desc = "E Homo sapiens" + icon_state = "syndicate" + icon_living = "syndicate" + icon_dead = "syndicate_dead" + icon_gib = "syndicate_gib" + + faction = "syndicate" + health = 150 // Point of human crit, as of commenting + maxHealth = 150 + movement_cooldown = 4 + + status_flags = 0 + + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + + harm_intent_damage = 5 + melee_damage_lower = 15 //Tac Knife damage + melee_damage_upper = 15 + attack_sharp = 1 + attack_edge = 1 + attacktext = list("slashed", "stabbed") + armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100) // Same armor values as the vest they drop, plus simple mob immunities + + corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier + loot_list = list(/obj/item/weapon/material/knife/tacknife = 100) // Might as well give it the knife + + ai_holder_type = /datum/ai_holder/simple_mob/merc + say_list_type = /datum/say_list/merc + + // Grenade special attack vars + var/grenade_type = /obj/item/weapon/grenade/explosive/concussion + special_attack_cooldown = 45 SECONDS + special_attack_min_range = 2 + special_attack_max_range = 7 + +//////////////////////////////// +// Grenade Attack +//////////////////////////////// + +// Any merc can use this, just set special_attack_charges to a positive value + +// Check if we should bother with the grenade +/mob/living/simple_mob/humanoid/merc/should_special_attack(atom/A) + var/mob_count = 0 // Checks to see if you can + var/turf/T = get_turf(A) + for(var/mob/M in range(T, 2)) + if(M.faction == faction) // Don't grenade our friends + return FALSE + if(M in oview(src, special_attack_max_range)) // And lets check if we can actually see at least two people before we throw a grenade + mob_count ++ + if(mob_count < 2) + return FALSE + else + return TRUE + +// Yes? Throw the grenade +/mob/living/simple_mob/humanoid/merc/do_special_attack(atom/A) + set waitfor = FALSE + set_AI_busy(TRUE) + + var/obj/item/weapon/grenade/G = new grenade_type(get_turf(src)) + if(istype(G)) + G.throw_at(A, G.throw_range, G.throw_speed, src) + G.attack_self(src) + + set_AI_busy(FALSE) + + +//////////////////////////////// +// Merc AI Types +//////////////////////////////// +/datum/ai_holder/simple_mob/merc + threaten = TRUE + returns_home = TRUE // Stay close to the base... + wander = TRUE // ... but "patrol" a little. + +/datum/ai_holder/simple_mob/merc/ranged + pointblank = TRUE // They get close? Just shoot 'em! + firing_lanes = TRUE // But not your buddies! + conserve_ammo = TRUE // And don't go wasting bullets! + + +//////////////////////////////// +// Melee +//////////////////////////////// +/mob/living/simple_mob/humanoid/merc/melee // Defined in case we add non-sword-and-board mercs + loot_list = list(/obj/item/weapon/material/knife/tacknife = 100) + +// Sword and Shield Merc +/mob/living/simple_mob/humanoid/merc/melee/sword + icon_state = "syndicatemelee" + icon_living = "syndicatemelee" + + melee_damage_lower = 30 + melee_damage_upper = 30 + attack_armor_pen = 50 + attack_sharp = 1 + attack_edge = 1 + attacktext = list("slashed") + + loot_list = list(/obj/item/weapon/melee/energy/sword/red = 100, /obj/item/weapon/shield/energy = 100) + +// They have a shield, so they try to block +/mob/living/simple_mob/humanoid/merc/melee/sword/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(O.force) + if(prob(20)) + visible_message("\The [src] blocks \the [O] with its shield!") + if(user) + ai_holder.react_to_attack(user) + return + else + ..() + else + usr << "This weapon is ineffective, it does no damage." + visible_message("\The [user] gently taps [src] with \the [O].") + +/mob/living/simple_mob/humanoid/merc/melee/sword/bullet_act(var/obj/item/projectile/Proj) + if(!Proj) return + if(prob(35)) + visible_message("[src] blocks [Proj] with its shield!") + if(Proj.firer) + ai_holder.react_to_attack(Proj.firer) + return + else + ..() + + +//////////////////////////////// +// Ranged +//////////////////////////////// + +// Base Ranged Merc, so we don't have to redefine a million vars for every subtype. Uses a pistol. +/mob/living/simple_mob/humanoid/merc/ranged + icon_state = "syndicateranged" + icon_living = "syndicateranged" + projectiletype = /obj/item/projectile/bullet/pistol/medium +// casingtype = /obj/item/ammo_casing/spent //Makes infinite stacks of bullets when put in PoIs. + projectilesound = 'sound/weapons/Gunshot_light.ogg' + loot_list = list(/obj/item/weapon/gun/projectile/colt = 100) + + needs_reload = TRUE + reload_max = 7 // Not the best default, but it fits the pistol + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged + +// C20r SMG +/mob/living/simple_mob/humanoid/merc/ranged/smg + icon_state = "syndicateranged_smg" + icon_living = "syndicateranged_smg" + + loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100) + + base_attack_cooldown = 5 // Two attacks a second or so. + reload_max = 20 + +// Laser Rifle +/mob/living/simple_mob/humanoid/merc/ranged/laser + icon_state = "syndicateranged_laser" + icon_living = "syndicateranged_laser" + projectiletype = /obj/item/projectile/beam/midlaser + projectilesound = 'sound/weapons/Laser.ogg' + + loot_list = list(/obj/item/weapon/gun/energy/laser = 100) + + reload_max = 10 + +// Ion Rifle +/mob/living/simple_mob/humanoid/merc/ranged/ionrifle + icon_state = "syndicateranged_ionrifle" + icon_living = "syndicateranged_ionrifle" + projectiletype = /obj/item/projectile/ion + projectilesound = 'sound/weapons/Laser.ogg' + + loot_list = list(/obj/item/weapon/gun/energy/ionrifle = 100) + + reload_max = 10 + +// Grenadier +/mob/living/simple_mob/humanoid/merc/ranged/grenadier + icon_state = "syndicateranged_shotgun" + icon_living = "syndicateranged_shotgun" + projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot + projectilesound = 'sound/weapons/gunshot/shotgun.ogg' + + loot_list = list(/obj/item/weapon/gun/projectile/shotgun/pump = 100) + + reload_max = 4 + reload_time = 1.5 SECONDS // It's a shotgun, it takes a moment + + special_attack_charges = 5 + + +//////////////////////////////// +// Space Mercs +//////////////////////////////// + +// Sword Space Merc +/mob/living/simple_mob/humanoid/merc/melee/sword/space + name = "syndicate commando" + icon_state = "syndicatemeleespace" + icon_living = "syndicatemeleespace" + + movement_cooldown = 0 + + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + corpse = /obj/effect/landmark/mobcorpse/syndicatecommando + +/mob/living/simple_mob/humanoid/merc/melee/sword/space/Process_Spacemove(var/check_drift = 0) + return + +// Ranged Space Merc +/mob/living/simple_mob/humanoid/merc/ranged/space + name = "syndicate sommando" + icon_state = "syndicaterangedpsace" + icon_living = "syndicaterangedpsace" + + movement_cooldown = 0 + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + corpse = /obj/effect/landmark/mobcorpse/syndicatecommando + +/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/check_drift = 0) + return + +//////////////////////////////// +// PoI Mercs +//////////////////////////////// + +// None of these drop weapons, until we have a better way to balance them +/mob/living/simple_mob/humanoid/merc/melee/poi + loot_list = list() + +/mob/living/simple_mob/humanoid/merc/melee/sword/poi + loot_list = list() + +/mob/living/simple_mob/humanoid/merc/ranged/poi + loot_list = list() + +/mob/living/simple_mob/humanoid/merc/ranged/smg/poi + loot_list = list() + +/mob/living/simple_mob/humanoid/merc/ranged/laser + loot_list = list() + +/mob/living/simple_mob/humanoid/merc/ranged/ionrifle + loot_list = list() + +/mob/living/simple_mob/humanoid/merc/ranged/grenadier/poi + loot_list = list() \ No newline at end of file diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm index 061ae73398..8fb7604417 100644 --- a/code/modules/planet/planet.dm +++ b/code/modules/planet/planet.dm @@ -30,9 +30,10 @@ current_time = current_time.make_random_time() update_sun() -/datum/planet/proc/process(amount) +/datum/planet/proc/process(last_fire) if(current_time) - current_time = current_time.add_seconds(amount) + var/difference = world.time - last_fire + current_time = current_time.add_seconds(difference SECONDS) update_weather() // We update this first, because some weather types decease the brightness of the sun. if(sun_last_process <= world.time - sun_process_interval) update_sun() diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 8717245b24..b8bbf7ba6a 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -184,7 +184,8 @@ datum/weather/sif ) /datum/weather/sif/snow/process_effects() - for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) + ..() + for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either if(S.z in holder.our_planet.expected_z_levels) for(var/dir_checked in cardinal) var/turf/simulated/floor/T = get_step(S, dir_checked) @@ -207,7 +208,8 @@ datum/weather/sif ) /datum/weather/sif/blizzard/process_effects() - for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) + ..() + for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either if(S.z in holder.our_planet.expected_z_levels) for(var/dir_checked in cardinal) var/turf/simulated/floor/T = get_step(S, dir_checked) @@ -219,6 +221,8 @@ datum/weather/sif name = "rain" icon_state = "rain" light_modifier = 0.5 + effect_message = "Rain falls on you." + transition_chances = list( WEATHER_OVERCAST = 25, WEATHER_LIGHT_SNOW = 10, @@ -228,6 +232,7 @@ datum/weather/sif ) /datum/weather/sif/rain/process_effects() + ..() for(var/mob/living/L in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(L) @@ -238,16 +243,19 @@ datum/weather/sif if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella)) var/obj/item/weapon/melee/umbrella/U = L.get_active_hand() if(U.open) - to_chat(L, "Rain patters softly onto your umbrella") + if(show_message) + to_chat(L, "Rain patters softly onto your umbrella") continue else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella)) var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand() if(U.open) - to_chat(L, "Rain patters softly onto your umbrella") + if(show_message) + to_chat(L, "Rain patters softly onto your umbrella") continue L.water_act(1) - to_chat(L, "Rain falls on you.") + if(show_message) + to_chat(L, effect_message) /datum/weather/sif/storm name = "storm" @@ -256,6 +264,8 @@ datum/weather/sif temp_low = 233.15 // -40c light_modifier = 0.3 flight_failure_modifier = 10 + + transition_chances = list( WEATHER_RAIN = 45, WEATHER_STORM = 40, @@ -264,6 +274,7 @@ datum/weather/sif ) /datum/weather/sif/storm/process_effects() + ..() for(var/mob/living/L in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(L) @@ -294,6 +305,10 @@ datum/weather/sif temp_low = 243.15 // -30c light_modifier = 0.3 flight_failure_modifier = 15 + timer_low_bound = 2 + timer_high_bound = 5 + effect_message = "The hail smacks into you!" + transition_chances = list( WEATHER_RAIN = 45, WEATHER_STORM = 40, @@ -302,6 +317,7 @@ datum/weather/sif ) /datum/weather/sif/hail/process_effects() + ..() for(var/mob/living/carbon/human/H in living_mob_list) if(H.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(H) @@ -309,15 +325,18 @@ datum/weather/sif continue // They're indoors, so no need to pelt them with ice. // If they have an open umbrella, it'll guard from rain + // Message plays every time the umbrella gets stolen, just so they're especially aware of what's happening if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella)) var/obj/item/weapon/melee/umbrella/U = H.get_active_hand() if(U.open) - to_chat(H, "Hail patters gently onto your umbrella.") + if(show_message) + to_chat(H, "Hail patters gently onto your umbrella.") continue else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella)) var/obj/item/weapon/melee/umbrella/U = H.get_inactive_hand() if(U.open) - to_chat(H, "Hail patters gently onto your umbrella.") + if(show_message) + to_chat(H, "Hail patters gently onto your umbrella.") continue var/target_zone = pick(BP_ALL) @@ -330,8 +349,9 @@ datum/weather/sif if(amount_soaked >= 10) continue // No need to apply damage. - H.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail") - to_chat(H, "The hail smacks into you!") + H.apply_damage(rand(1, 3), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail") + if(show_message) + to_chat(H, effect_message) /datum/weather/sif/blood_moon name = "blood moon" diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm index 11c902f77f..724540c875 100644 --- a/code/modules/planet/weather.dm +++ b/code/modules/planet/weather.dm @@ -25,7 +25,7 @@ if(current_weather) old_light_modifier = current_weather.light_modifier // We store the old one, so we can determine if recalculating the sun is needed. current_weather = allowed_weather_types[new_weather] - next_weather_shift = world.time + rand(20, 30) MINUTES + next_weather_shift = world.time + rand(current_weather.timer_low_bound, current_weather.timer_high_bound) MINUTES update_icon_effects() update_temperature() @@ -66,8 +66,20 @@ var/flight_failure_modifier = 0 // Some types of weather make flying harder, and therefore make crashes more likely. var/transition_chances = list() // Assoc list var/datum/weather_holder/holder = null + var/timer_low_bound = 5 // How long this weather must run before it tries to change, in minutes + var/timer_high_bound = 10 // How long this weather can run before it tries to change, in minutes + + var/effect_message = null // Should be a string, this is what is shown to a mob caught in the weather + var/last_message = 0 // Keeps track of when the weather last tells EVERY player it's hitting them + var/message_delay = 10 SECONDS // Delay in between weather hit messages + var/show_message = FALSE // Is set to TRUE and plays the messsage every [message_delay] /datum/weather/proc/process_effects() + show_message = FALSE // Need to reset the show_message var, just in case + if(effect_message) // Only bother with the code below if we actually need to display something + if(world.time >= last_message + message_delay) + last_message = world.time // Reset the timer + show_message = TRUE // Tell the rest of the process that we need to make a message return // All this does is hold the weather icon. diff --git a/html/changelogs/Mechoid - AI_Drones.yml b/html/changelogs/Mechoid - AI_Drones.yml new file mode 100644 index 0000000000..df2c200589 --- /dev/null +++ b/html/changelogs/Mechoid - AI_Drones.yml @@ -0,0 +1,7 @@ + +author: Mechoid + +delete-after: True + +changes: + - rscadd: "Allow AIs to create and take control of mindless drones from fabricators." diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 15af8f105f9d80ce7d2498aa7a35ebe3db5dc256..b360135495990752848ca08fb34f1205cc3a42e9 100644 GIT binary patch literal 283168 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%0Ac33=UCZd7CUbwFoA{eE@N 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%0A19K2U?8P+>*}OAyn&gRizF5}c$-xT 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�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
dQxva0b>W_10*t$MT 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