Merge branch 'dev' of https://github.com/Baystation12/Baystation12 into phoronwindowsv2

This commit is contained in:
Atlantis
2015-09-01 03:22:08 +02:00
895 changed files with 23822 additions and 19893 deletions

View File

@@ -4,7 +4,8 @@ sudo: false
env: env:
BYOND_MAJOR="508" BYOND_MAJOR="508"
BYOND_MINOR="1287" BYOND_MINOR="1293"
MACRO_COUNT=1171
cache: cache:
directories: directories:
@@ -32,7 +33,7 @@ script:
- (! grep 'step_[xy]' maps/**/*.dmm) - (! grep 'step_[xy]' maps/**/*.dmm)
- (! find nano/templates/ -type f -exec md5sum {} + | sort | uniq -D -w 32 | grep nano) - (! find nano/templates/ -type f -exec md5sum {} + | sort | uniq -D -w 32 | grep nano)
- (! grep -E "<\s*span\s+class\s*=\s*('[^'>]+|[^'>]+')\s*>" **/*.dm) - (! grep -E "<\s*span\s+class\s*=\s*('[^'>]+|[^'>]+')\s*>" **/*.dm)
- (num=`grep -E '\\\\(red|blue|green|black|b|i[^mc])' **/*.dm | wc -l`; echo "$num escapes (expecting 1257 or less)"; [ $num -le 1257 ]) - (num=`grep -E '\\\\(red|blue|green|black|b|i[^mc])' **/*.dm | wc -l`; echo "$num escapes (expecting ${MACRO_COUNT} or less)"; [ $num -le ${MACRO_COUNT} ])
- md5sum -c - <<< "0af969f671fba6cf9696c78cd175a14a *baystation12.int" - md5sum -c - <<< "0af969f671fba6cf9696c78cd175a14a *baystation12.int"
- md5sum -c - <<< "88490b460c26947f5ec1ab1bb9fa9f17 *html/changelogs/example.yml" - md5sum -c - <<< "88490b460c26947f5ec1ab1bb9fa9f17 *html/changelogs/example.yml"
- python tools/TagMatcher/tag-matcher.py ../.. - python tools/TagMatcher/tag-matcher.py ../..

View File

@@ -24,12 +24,15 @@
#include "code\__defines\dna.dm" #include "code\__defines\dna.dm"
#include "code\__defines\gamemode.dm" #include "code\__defines\gamemode.dm"
#include "code\__defines\items_clothing.dm" #include "code\__defines\items_clothing.dm"
#include "code\__defines\lighting.dm"
#include "code\__defines\machinery.dm" #include "code\__defines\machinery.dm"
#include "code\__defines\math_physics.dm" #include "code\__defines\math_physics.dm"
#include "code\__defines\misc.dm" #include "code\__defines\misc.dm"
#include "code\__defines\mobs.dm" #include "code\__defines\mobs.dm"
#include "code\__defines\research.dm" #include "code\__defines\research.dm"
#include "code\__defines\species_languages.dm" #include "code\__defines\species_languages.dm"
#include "code\__defines\turfs.dm"
#include "code\_helpers\atmospherics.dm"
#include "code\_helpers\datum_pool.dm" #include "code\_helpers\datum_pool.dm"
#include "code\_helpers\files.dm" #include "code\_helpers\files.dm"
#include "code\_helpers\game.dm" #include "code\_helpers\game.dm"
@@ -126,7 +129,6 @@
#include "code\controllers\Processes\mob.dm" #include "code\controllers\Processes\mob.dm"
#include "code\controllers\Processes\nanoui.dm" #include "code\controllers\Processes\nanoui.dm"
#include "code\controllers\Processes\obj.dm" #include "code\controllers\Processes\obj.dm"
#include "code\controllers\Processes\pipenet.dm"
#include "code\controllers\Processes\Shuttle.dm" #include "code\controllers\Processes\Shuttle.dm"
#include "code\controllers\Processes\sun.dm" #include "code\controllers\Processes\sun.dm"
#include "code\controllers\Processes\supply.dm" #include "code\controllers\Processes\supply.dm"
@@ -144,6 +146,7 @@
#include "code\datums\ai_laws.dm" #include "code\datums\ai_laws.dm"
#include "code\datums\browser.dm" #include "code\datums\browser.dm"
#include "code\datums\computerfiles.dm" #include "code\datums\computerfiles.dm"
#include "code\datums\crew.dm"
#include "code\datums\datacore.dm" #include "code\datums\datacore.dm"
#include "code\datums\datumvars.dm" #include "code\datums\datumvars.dm"
#include "code\datums\disease.dm" #include "code\datums\disease.dm"
@@ -219,7 +222,6 @@
#include "code\defines\procs\dbcore.dm" #include "code\defines\procs\dbcore.dm"
#include "code\defines\procs\hud.dm" #include "code\defines\procs\hud.dm"
#include "code\defines\procs\radio.dm" #include "code\defines\procs\radio.dm"
#include "code\defines\procs\records.dm"
#include "code\defines\procs\sd_Alert.dm" #include "code\defines\procs\sd_Alert.dm"
#include "code\defines\procs\statistics.dm" #include "code\defines\procs\statistics.dm"
#include "code\game\asteroid.dm" #include "code\game\asteroid.dm"
@@ -354,7 +356,6 @@
#include "code\game\machinery\autolathe.dm" #include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\autolathe_datums.dm" #include "code\game\machinery\autolathe_datums.dm"
#include "code\game\machinery\Beacon.dm" #include "code\game\machinery\Beacon.dm"
#include "code\game\machinery\bees_items.dm"
#include "code\game\machinery\biogenerator.dm" #include "code\game\machinery\biogenerator.dm"
#include "code\game\machinery\bioprinter.dm" #include "code\game\machinery\bioprinter.dm"
#include "code\game\machinery\bluespacerelay.dm" #include "code\game\machinery\bluespacerelay.dm"
@@ -370,6 +371,7 @@
#include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\doppler_array.dm"
#include "code\game\machinery\flasher.dm" #include "code\game\machinery\flasher.dm"
#include "code\game\machinery\floodlight.dm" #include "code\game\machinery\floodlight.dm"
#include "code\game\machinery\floor_light.dm"
#include "code\game\machinery\floorlayer.dm" #include "code\game\machinery\floorlayer.dm"
#include "code\game\machinery\hologram.dm" #include "code\game\machinery\hologram.dm"
#include "code\game\machinery\holosign.dm" #include "code\game\machinery\holosign.dm"
@@ -385,7 +387,6 @@
#include "code\game\machinery\nuclear_bomb.dm" #include "code\game\machinery\nuclear_bomb.dm"
#include "code\game\machinery\OpTable.dm" #include "code\game\machinery\OpTable.dm"
#include "code\game\machinery\overview.dm" #include "code\game\machinery\overview.dm"
#include "code\game\machinery\portable_tag_turret.dm"
#include "code\game\machinery\portable_turret.dm" #include "code\game\machinery\portable_turret.dm"
#include "code\game\machinery\recharger.dm" #include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm" #include "code\game\machinery\rechargestation.dm"
@@ -398,6 +399,7 @@
#include "code\game\machinery\status_display_ai.dm" #include "code\game\machinery\status_display_ai.dm"
#include "code\game\machinery\suit_storage_unit.dm" #include "code\game\machinery\suit_storage_unit.dm"
#include "code\game\machinery\supply_display.dm" #include "code\game\machinery\supply_display.dm"
#include "code\game\machinery\supplybeacon.dm"
#include "code\game\machinery\syndicatebeacon.dm" #include "code\game\machinery\syndicatebeacon.dm"
#include "code\game\machinery\teleporter.dm" #include "code\game\machinery\teleporter.dm"
#include "code\game\machinery\turret_control.dm" #include "code\game\machinery\turret_control.dm"
@@ -576,7 +578,6 @@
#include "code\game\objects\effects\decals\posters\bs12.dm" #include "code\game\objects\effects\decals\posters\bs12.dm"
#include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\bodybag.dm"
@@ -605,6 +606,7 @@
#include "code\game\objects\items\devices\scanners.dm" #include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\spy_bug.dm"
#include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\suit_cooling.dm"
#include "code\game\objects\items\devices\t_scanner.dm"
#include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\taperecorder.dm"
#include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\traitordevices.dm"
#include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\transfer_valve.dm"
@@ -633,14 +635,12 @@
#include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\rods.dm"
#include "code\game\objects\items\stacks\stack.dm" #include "code\game\objects\items\stacks\stack.dm"
#include "code\game\objects\items\stacks\sheets\leather.dm" #include "code\game\objects\items\stacks\sheets\leather.dm"
#include "code\game\objects\items\stacks\sheets\light.dm"
#include "code\game\objects\items\stacks\tiles\light.dm"
#include "code\game\objects\items\stacks\tiles\plasteel.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\weapons\AI_modules.dm" #include "code\game\objects\items\weapons\AI_modules.dm"
#include "code\game\objects\items\weapons\autopsy.dm" #include "code\game\objects\items\weapons\autopsy.dm"
#include "code\game\objects\items\weapons\candle.dm" #include "code\game\objects\items\weapons\candle.dm"
#include "code\game\objects\items\weapons\cards_ids.dm" #include "code\game\objects\items\weapons\cards_ids.dm"
#include "code\game\objects\items\weapons\cards_ids_syndicate.dm"
#include "code\game\objects\items\weapons\cigs_lighters.dm" #include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\clown_items.dm" #include "code\game\objects\items\weapons\clown_items.dm"
#include "code\game\objects\items\weapons\cosmetics.dm" #include "code\game\objects\items\weapons\cosmetics.dm"
@@ -687,6 +687,7 @@
#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\commsantenna.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\commsantenna.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\power.dm"
@@ -695,6 +696,7 @@
#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm"
#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm"
#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm"
#include "code\game\objects\items\weapons\grenades\emgrenade.dm" #include "code\game\objects\items\weapons\grenades\emgrenade.dm"
#include "code\game\objects\items\weapons\grenades\flashbang.dm" #include "code\game\objects\items\weapons\grenades\flashbang.dm"
@@ -772,6 +774,7 @@
#include "code\game\objects\structures\watercloset.dm" #include "code\game\objects\structures\watercloset.dm"
#include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\windoor_assembly.dm"
#include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window.dm"
#include "code\game\objects\structures\window_spawner.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm" #include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\crates.dm"
#include "code\game\objects\structures\crates_lockers\largecrate.dm" #include "code\game\objects\structures\crates_lockers\largecrate.dm"
@@ -806,9 +809,18 @@
#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm"
#include "code\game\turfs\simulated.dm" #include "code\game\turfs\simulated.dm"
#include "code\game\turfs\turf.dm" #include "code\game\turfs\turf.dm"
#include "code\game\turfs\turf_changing.dm"
#include "code\game\turfs\turf_flick_animations.dm" #include "code\game\turfs\turf_flick_animations.dm"
#include "code\game\turfs\unsimulated.dm" #include "code\game\turfs\unsimulated.dm"
#include "code\game\turfs\flooring\flooring.dm"
#include "code\game\turfs\flooring\flooring_decals.dm"
#include "code\game\turfs\flooring\flooring_premade.dm"
#include "code\game\turfs\simulated\floor.dm" #include "code\game\turfs\simulated\floor.dm"
#include "code\game\turfs\simulated\floor_acts.dm"
#include "code\game\turfs\simulated\floor_attackby.dm"
#include "code\game\turfs\simulated\floor_damage.dm"
#include "code\game\turfs\simulated\floor_icon.dm"
#include "code\game\turfs\simulated\floor_static.dm"
#include "code\game\turfs\simulated\floor_types.dm" #include "code\game\turfs\simulated\floor_types.dm"
#include "code\game\turfs\simulated\wall_attacks.dm" #include "code\game\turfs\simulated\wall_attacks.dm"
#include "code\game\turfs\simulated\wall_icon.dm" #include "code\game\turfs\simulated\wall_icon.dm"
@@ -829,6 +841,7 @@
#include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_memo.dm" #include "code\modules\admin\admin_memo.dm"
#include "code\modules\admin\admin_ranks.dm" #include "code\modules\admin\admin_ranks.dm"
#include "code\modules\admin\admin_secrets.dm"
#include "code\modules\admin\admin_verbs.dm" #include "code\modules\admin\admin_verbs.dm"
#include "code\modules\admin\banjob.dm" #include "code\modules\admin\banjob.dm"
#include "code\modules\admin\create_mob.dm" #include "code\modules\admin\create_mob.dm"
@@ -836,6 +849,7 @@
#include "code\modules\admin\create_turf.dm" #include "code\modules\admin\create_turf.dm"
#include "code\modules\admin\holder2.dm" #include "code\modules\admin\holder2.dm"
#include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\IsBanned.dm"
#include "code\modules\admin\map_capture.dm"
#include "code\modules\admin\NewBan.dm" #include "code\modules\admin\NewBan.dm"
#include "code\modules\admin\player_notes.dm" #include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm" #include "code\modules\admin\player_panel.dm"
@@ -843,6 +857,43 @@
#include "code\modules\admin\ToRban.dm" #include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\DB ban\functions.dm" #include "code\modules\admin\DB ban\functions.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm"
#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm"
#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm"
#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm"
#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm"
#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm"
#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm"
#include "code\modules\admin\secrets\admin_secrets\list_dna.dm"
#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm"
#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm"
#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm"
#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm"
#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm"
#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm"
#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm"
#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm"
#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm"
#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm"
#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm"
#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm"
#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm"
#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm"
#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm"
#include "code\modules\admin\secrets\fun_secrets\make_all_areas_powered.dm"
#include "code\modules\admin\secrets\fun_secrets\make_all_areas_unpowered.dm"
#include "code\modules\admin\secrets\fun_secrets\only_one.dm"
#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm"
#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm"
#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm"
#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm"
#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm"
#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm"
#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm"
#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm"
#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm"
#include "code\modules\admin\secrets\random_events\gravity.dm"
#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm"
#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm"
#include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm" #include "code\modules\admin\verbs\adminjump.dm"
#include "code\modules\admin\verbs\adminpm.dm" #include "code\modules\admin\verbs\adminpm.dm"
@@ -908,6 +959,7 @@
#include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_spawnpoints.dm"
#include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\preferences_toggles.dm"
#include "code\modules\client\ui_style.dm"
#include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\ears\skrell.dm" #include "code\modules\clothing\ears\skrell.dm"
@@ -1062,11 +1114,11 @@
#include "code\modules\hydroponics\seed_mobs.dm" #include "code\modules\hydroponics\seed_mobs.dm"
#include "code\modules\hydroponics\seed_packets.dm" #include "code\modules\hydroponics\seed_packets.dm"
#include "code\modules\hydroponics\seed_storage.dm" #include "code\modules\hydroponics\seed_storage.dm"
#include "code\modules\hydroponics\beekeeping\beehive.dm"
#include "code\modules\hydroponics\spreading\spreading.dm" #include "code\modules\hydroponics\spreading\spreading.dm"
#include "code\modules\hydroponics\spreading\spreading_growth.dm" #include "code\modules\hydroponics\spreading\spreading_growth.dm"
#include "code\modules\hydroponics\spreading\spreading_response.dm" #include "code\modules\hydroponics\spreading\spreading_response.dm"
#include "code\modules\hydroponics\trays\tray.dm" #include "code\modules\hydroponics\trays\tray.dm"
#include "code\modules\hydroponics\trays\tray_apiary.dm"
#include "code\modules\hydroponics\trays\tray_process.dm" #include "code\modules\hydroponics\trays\tray_process.dm"
#include "code\modules\hydroponics\trays\tray_reagents.dm" #include "code\modules\hydroponics\trays\tray_reagents.dm"
#include "code\modules\hydroponics\trays\tray_soil.dm" #include "code\modules\hydroponics\trays\tray_soil.dm"
@@ -1112,6 +1164,7 @@
#include "code\modules\mob\animations.dm" #include "code\modules\mob\animations.dm"
#include "code\modules\mob\death.dm" #include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm" #include "code\modules\mob\emote.dm"
#include "code\modules\mob\gender.dm"
#include "code\modules\mob\hear_say.dm" #include "code\modules\mob\hear_say.dm"
#include "code\modules\mob\holder.dm" #include "code\modules\mob\holder.dm"
#include "code\modules\mob\inventory.dm" #include "code\modules\mob\inventory.dm"
@@ -1265,6 +1318,7 @@
#include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\silicon.dm"
#include "code\modules\mob\living\silicon\subystems.dm" #include "code\modules\mob\living\silicon\subystems.dm"
#include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\ai.dm"
#include "code\modules\mob\living\silicon\ai\ai_movement.dm"
#include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\death.dm"
#include "code\modules\mob\living\silicon\ai\examine.dm" #include "code\modules\mob\living\silicon\ai\examine.dm"
#include "code\modules\mob\living\silicon\ai\icons.dm" #include "code\modules\mob\living\silicon\ai\icons.dm"
@@ -1277,6 +1331,7 @@
#include "code\modules\mob\living\silicon\decoy\death.dm" #include "code\modules\mob\living\silicon\decoy\death.dm"
#include "code\modules\mob\living\silicon\decoy\decoy.dm" #include "code\modules\mob\living\silicon\decoy\decoy.dm"
#include "code\modules\mob\living\silicon\decoy\life.dm" #include "code\modules\mob\living\silicon\decoy\life.dm"
#include "code\modules\mob\living\silicon\pai\admin.dm"
#include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\death.dm"
#include "code\modules\mob\living\silicon\pai\examine.dm" #include "code\modules\mob\living\silicon\pai\examine.dm"
#include "code\modules\mob\living\silicon\pai\life.dm" #include "code\modules\mob\living\silicon\pai\life.dm"
@@ -1302,13 +1357,14 @@
#include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\syndicate.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm"
#include "code\modules\mob\living\simple_animal\bees.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_say.dm"
#include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\shade.dm"
@@ -1367,6 +1423,7 @@
#include "code\modules\nano\interaction\default.dm" #include "code\modules\nano\interaction\default.dm"
#include "code\modules\nano\interaction\inventory.dm" #include "code\modules\nano\interaction\inventory.dm"
#include "code\modules\nano\interaction\inventory_deep.dm" #include "code\modules\nano\interaction\inventory_deep.dm"
#include "code\modules\nano\interaction\outside.dm"
#include "code\modules\nano\interaction\physical.dm" #include "code\modules\nano\interaction\physical.dm"
#include "code\modules\nano\interaction\self.dm" #include "code\modules\nano\interaction\self.dm"
#include "code\modules\nano\interaction\zlevel.dm" #include "code\modules\nano\interaction\zlevel.dm"
@@ -1410,6 +1467,7 @@
#include "code\modules\paperwork\paper.dm" #include "code\modules\paperwork\paper.dm"
#include "code\modules\paperwork\paper_bundle.dm" #include "code\modules\paperwork\paper_bundle.dm"
#include "code\modules\paperwork\paperbin.dm" #include "code\modules\paperwork\paperbin.dm"
#include "code\modules\paperwork\papershredder.dm"
#include "code\modules\paperwork\pen.dm" #include "code\modules\paperwork\pen.dm"
#include "code\modules\paperwork\photocopier.dm" #include "code\modules\paperwork\photocopier.dm"
#include "code\modules\paperwork\photography.dm" #include "code\modules\paperwork\photography.dm"
@@ -1421,7 +1479,6 @@
#include "code\modules\power\cable.dm" #include "code\modules\power\cable.dm"
#include "code\modules\power\cable_heavyduty.dm" #include "code\modules\power\cable_heavyduty.dm"
#include "code\modules\power\cell.dm" #include "code\modules\power\cell.dm"
#include "code\modules\power\engine.dm"
#include "code\modules\power\fractal_reactor.dm" #include "code\modules\power\fractal_reactor.dm"
#include "code\modules\power\generator.dm" #include "code\modules\power\generator.dm"
#include "code\modules\power\generator_type2.dm" #include "code\modules\power\generator_type2.dm"
@@ -1496,6 +1553,10 @@
#include "code\modules\random_map\automata\automata.dm" #include "code\modules\random_map\automata\automata.dm"
#include "code\modules\random_map\automata\caves.dm" #include "code\modules\random_map\automata\caves.dm"
#include "code\modules\random_map\building\building.dm" #include "code\modules\random_map\building\building.dm"
#include "code\modules\random_map\drop\drop_types.dm"
#include "code\modules\random_map\drop\droppod.dm"
#include "code\modules\random_map\drop\droppod_doors.dm"
#include "code\modules\random_map\drop\supply.dm"
#include "code\modules\random_map\mazes\maze.dm" #include "code\modules\random_map\mazes\maze.dm"
#include "code\modules\random_map\mazes\maze_cell.dm" #include "code\modules\random_map\mazes\maze_cell.dm"
#include "code\modules\random_map\noise\desert.dm" #include "code\modules\random_map\noise\desert.dm"
@@ -1505,6 +1566,7 @@
#include "code\modules\random_map\noise\tundra.dm" #include "code\modules\random_map\noise\tundra.dm"
#include "code\modules\reagents\Chemistry-Colours.dm" #include "code\modules\reagents\Chemistry-Colours.dm"
#include "code\modules\reagents\Chemistry-Holder.dm" #include "code\modules\reagents\Chemistry-Holder.dm"
#include "code\modules\reagents\Chemistry-Logging.dm"
#include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Machinery.dm"
#include "code\modules\reagents\Chemistry-Metabolism.dm" #include "code\modules\reagents\Chemistry-Metabolism.dm"
#include "code\modules\reagents\Chemistry-Readme.dm" #include "code\modules\reagents\Chemistry-Readme.dm"
@@ -1553,6 +1615,7 @@
#include "code\modules\research\circuitprinter.dm" #include "code\modules\research\circuitprinter.dm"
#include "code\modules\research\designs.dm" #include "code\modules\research\designs.dm"
#include "code\modules\research\destructive_analyzer.dm" #include "code\modules\research\destructive_analyzer.dm"
#include "code\modules\research\mechfab_designs.dm"
#include "code\modules\research\message_server.dm" #include "code\modules\research\message_server.dm"
#include "code\modules\research\protolathe.dm" #include "code\modules\research\protolathe.dm"
#include "code\modules\research\rd-readme.dm" #include "code\modules\research\rd-readme.dm"
@@ -1673,16 +1736,15 @@
#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" #include "code\modules\spells\aoe_turf\conjure\forcewall.dm"
#include "code\modules\spells\general\area_teleport.dm" #include "code\modules\spells\general\area_teleport.dm"
#include "code\modules\spells\general\rune_write.dm" #include "code\modules\spells\general\rune_write.dm"
#include "code\modules\spells\targeted\disintegrate.dm"
#include "code\modules\spells\targeted\ethereal_jaunt.dm" #include "code\modules\spells\targeted\ethereal_jaunt.dm"
#include "code\modules\spells\targeted\flesh_to_stone.dm"
#include "code\modules\spells\targeted\genetic.dm" #include "code\modules\spells\targeted\genetic.dm"
#include "code\modules\spells\targeted\harvest.dm" #include "code\modules\spells\targeted\harvest.dm"
#include "code\modules\spells\targeted\horsemask.dm"
#include "code\modules\spells\targeted\mind_transfer.dm" #include "code\modules\spells\targeted\mind_transfer.dm"
#include "code\modules\spells\targeted\shift.dm" #include "code\modules\spells\targeted\shift.dm"
#include "code\modules\spells\targeted\subjugate.dm" #include "code\modules\spells\targeted\subjugate.dm"
#include "code\modules\spells\targeted\targeted.dm" #include "code\modules\spells\targeted\targeted.dm"
#include "code\modules\spells\targeted\equip\equip.dm"
#include "code\modules\spells\targeted\equip\horsemask.dm"
#include "code\modules\spells\targeted\projectile\dumbfire.dm" #include "code\modules\spells\targeted\projectile\dumbfire.dm"
#include "code\modules\spells\targeted\projectile\fireball.dm" #include "code\modules\spells\targeted\projectile\fireball.dm"
#include "code\modules\spells\targeted\projectile\magic_missile.dm" #include "code\modules\spells\targeted\projectile\magic_missile.dm"

View File

@@ -12,14 +12,14 @@
#define PIPE_COLOR_CYAN "#00ffff" #define PIPE_COLOR_CYAN "#00ffff"
#define PIPE_COLOR_GREEN "#00ff00" #define PIPE_COLOR_GREEN "#00ff00"
#define PIPE_COLOR_YELLOW "#ffcc00" #define PIPE_COLOR_YELLOW "#ffcc00"
#define PIPE_COLOR_PURPLE "#5c1ec0" #define PIPE_COLOR_BLACK "#444444"
#define CONNECT_TYPE_REGULAR 1 #define CONNECT_TYPE_REGULAR 1
#define CONNECT_TYPE_SUPPLY 2 #define CONNECT_TYPE_SUPPLY 2
#define CONNECT_TYPE_SCRUBBER 4 #define CONNECT_TYPE_SCRUBBER 4
#define CONNECT_TYPE_HE 8 #define CONNECT_TYPE_HE 8
var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE) var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "black" = PIPE_COLOR_BLACK)
/proc/pipe_color_lookup(var/color) /proc/pipe_color_lookup(var/color)
for(var/C in pipe_colors) for(var/C in pipe_colors)

View File

@@ -49,7 +49,7 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) /obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type)
if(node) if(node)
if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) if(!T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe))
//underlays += icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) //underlays += icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node))
underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type)
else else

View File

@@ -8,8 +8,6 @@
#define PRESSURE_CHECK_INPUT 2 #define PRESSURE_CHECK_INPUT 2
#define PRESSURE_CHECK_OUTPUT 4 #define PRESSURE_CHECK_OUTPUT 4
#undefine
/obj/machinery/atmospherics/binary/dp_vent_pump /obj/machinery/atmospherics/binary/dp_vent_pump
icon = 'icons/atmos/vent_pump.dmi' icon = 'icons/atmos/vent_pump.dmi'
icon_state = "map_dp_vent" icon_state = "map_dp_vent"
@@ -69,7 +67,7 @@
if(!istype(T)) if(!istype(T))
return return
if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) if(!T.is_plating() && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe))
vent_icon += "h" vent_icon += "h"
if(!powered()) if(!powered())
@@ -85,7 +83,7 @@
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(!istype(T)) if(!istype(T))
return return
if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) if(!T.is_plating() && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe))
return return
else else
if (node1) if (node1)
@@ -258,4 +256,14 @@
spawn(2) spawn(2)
broadcast_status() broadcast_status()
update_icon() update_icon()
#undef DEFAULT_PRESSURE_DELTA
#undef EXTERNAL_PRESSURE_BOUND
#undef INTERNAL_PRESSURE_BOUND
#undef PRESSURE_CHECKS
#undef PRESSURE_CHECK_EXTERNAL
#undef PRESSURE_CHECK_INPUT
#undef PRESSURE_CHECK_OUTPUT

View File

@@ -2,8 +2,6 @@
#define REGULATE_INPUT 1 //shuts off when input side is below the target pressure #define REGULATE_INPUT 1 //shuts off when input side is below the target pressure
#define REGULATE_OUTPUT 2 //shuts off when output side is above the target pressure #define REGULATE_OUTPUT 2 //shuts off when output side is above the target pressure
#undefine
/obj/machinery/atmospherics/binary/passive_gate /obj/machinery/atmospherics/binary/passive_gate
icon = 'icons/atmos/passive_gate.dmi' icon = 'icons/atmos/passive_gate.dmi'
icon_state = "map" icon_state = "map"
@@ -259,3 +257,7 @@
"You hear ratchet.") "You hear ratchet.")
new /obj/item/pipe(loc, make_from=src) new /obj/item/pipe(loc, make_from=src)
qdel(src) qdel(src)
#undef REGULATE_NONE
#undef REGULATE_INPUT
#undef REGULATE_OUTPUT

View File

@@ -189,7 +189,7 @@
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(!istype(T)) if(!istype(T))
return return
if(T.intact && istype(P.node, /obj/machinery/atmospherics/pipe) && P.node.level == 1 ) if(!T.is_plating() && istype(P.node, /obj/machinery/atmospherics/pipe) && P.node.level == 1 )
//pipe_state = icon_manager.get_atmos_icon("underlay_down", P.dir, color_cache_name(P.node)) //pipe_state = icon_manager.get_atmos_icon("underlay_down", P.dir, color_cache_name(P.node))
pipe_state = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "down") pipe_state = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "down")
else else

View File

@@ -43,6 +43,13 @@
node = target node = target
break break
//copied from pipe construction code since heaters/freezers don't use fittings and weren't doing this check - this all really really needs to be refactored someday.
//check that there are no incompatible pipes/machinery in our own location
for(var/obj/machinery/atmospherics/M in src.loc)
if(M != src && (M.initialize_directions & node_connect) && M.check_connect_types(M,src)) // matches at least one direction on either type of pipe & same connection type
node = null
break
update_icon() update_icon()
/obj/machinery/atmospherics/unary/freezer/update_icon() /obj/machinery/atmospherics/unary/freezer/update_icon()

View File

@@ -69,7 +69,7 @@
if (!istype(W, /obj/item/weapon/wrench)) if (!istype(W, /obj/item/weapon/wrench))
return ..() return ..()
var/turf/T = src.loc var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact) if (level==1 && isturf(T) && !T.is_plating())
user << "<span class='warning'>You must remove the plating first.</span>" user << "<span class='warning'>You must remove the plating first.</span>"
return 1 return 1
var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/int_air = return_air()

View File

@@ -39,11 +39,19 @@
var/node_connect = dir var/node_connect = dir
//check that there is something to connect to
for(var/obj/machinery/atmospherics/target in get_step(src, node_connect)) for(var/obj/machinery/atmospherics/target in get_step(src, node_connect))
if(target.initialize_directions & get_dir(target, src)) if(target.initialize_directions & get_dir(target, src))
node = target node = target
break break
//copied from pipe construction code since heaters/freezers don't use fittings and weren't doing this check - this all really really needs to be refactored someday.
//check that there are no incompatible pipes/machinery in our own location
for(var/obj/machinery/atmospherics/M in src.loc)
if(M != src && (M.initialize_directions & node_connect) && M.check_connect_types(M,src)) // matches at least one direction on either type of pipe & same connection type
node = null
break
update_icon() update_icon()

View File

@@ -7,8 +7,6 @@
#define PRESSURE_CHECK_EXTERNAL 1 #define PRESSURE_CHECK_EXTERNAL 1
#define PRESSURE_CHECK_INTERNAL 2 #define PRESSURE_CHECK_INTERNAL 2
#undefine
/obj/machinery/atmospherics/unary/vent_pump /obj/machinery/atmospherics/unary/vent_pump
icon = 'icons/atmos/vent_pump.dmi' icon = 'icons/atmos/vent_pump.dmi'
icon_state = "map_vent" icon_state = "map_vent"
@@ -118,7 +116,7 @@
if(!istype(T)) if(!istype(T))
return return
if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) if(!T.is_plating() && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe))
vent_icon += "h" vent_icon += "h"
if(welded) if(welded)
@@ -136,7 +134,7 @@
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(!istype(T)) if(!istype(T))
return return
if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) if(!T.is_plating() && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe))
return return
else else
if(node) if(node)
@@ -399,7 +397,7 @@
user << "<span class='warning'>You cannot unwrench \the [src], turn it off first.</span>" user << "<span class='warning'>You cannot unwrench \the [src], turn it off first.</span>"
return 1 return 1
var/turf/T = src.loc var/turf/T = src.loc
if (node && node.level==1 && isturf(T) && T.intact) if (node && node.level==1 && isturf(T) && !T.is_plating())
user << "<span class='warning'>You must remove the plating first.</span>" user << "<span class='warning'>You must remove the plating first.</span>"
return 1 return 1
var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/int_air = return_air()
@@ -424,3 +422,12 @@
initial_loc.air_vent_names -= id_tag initial_loc.air_vent_names -= id_tag
..() ..()
return return
#undef DEFAULT_PRESSURE_DELTA
#undef EXTERNAL_PRESSURE_BOUND
#undef INTERNAL_PRESSURE_BOUND
#undef PRESSURE_CHECKS
#undef PRESSURE_CHECK_EXTERNAL
#undef PRESSURE_CHECK_INTERNAL

View File

@@ -72,7 +72,7 @@
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(!istype(T)) if(!istype(T))
return return
if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) if(!T.is_plating() && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe))
return return
else else
if(node) if(node)
@@ -261,7 +261,7 @@
user << "<span class='warning'>You cannot unwrench \the [src], turn it off first.</span>" user << "<span class='warning'>You cannot unwrench \the [src], turn it off first.</span>"
return 1 return 1
var/turf/T = src.loc var/turf/T = src.loc
if (node && node.level==1 && isturf(T) && T.intact) if (node && node.level==1 && isturf(T) && !T.is_plating())
user << "<span class='warning'>You must remove the plating first.</span>" user << "<span class='warning'>You must remove the plating first.</span>"
return 1 return 1
var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/int_air = return_air()

View File

@@ -181,7 +181,7 @@ obj/machinery/atmospherics/mains_pipe/simple
..() // initialize internal pipes ..() // initialize internal pipes
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) if(level == 1 && !T.is_plating()) hide(1)
update_icon() update_icon()
hidden hidden
@@ -243,7 +243,7 @@ obj/machinery/atmospherics/mains_pipe/manifold
..() // initialize internal pipes ..() // initialize internal pipes
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) if(level == 1 && !T.is_plating()) hide(1)
update_icon() update_icon()
update_icon() update_icon()
@@ -293,7 +293,7 @@ obj/machinery/atmospherics/mains_pipe/manifold4w
..() // initialize internal pipes ..() // initialize internal pipes
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) if(level == 1 && !T.is_plating()) hide(1)
update_icon() update_icon()
update_icon() update_icon()
@@ -354,7 +354,7 @@ obj/machinery/atmospherics/mains_pipe/split
N1.merge(N2) N1.merge(N2)
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) if(level == 1 && !T.is_plating()) hide(1)
update_icon() update_icon()
update_icon() update_icon()
@@ -475,7 +475,7 @@ obj/machinery/atmospherics/mains_pipe/split3
N1.merge(N2) N1.merge(N2)
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) if(level == 1 && !T.is_plating()) hide(1)
update_icon() update_icon()
update_icon() update_icon()
@@ -525,7 +525,7 @@ obj/machinery/atmospherics/mains_pipe/cap
..() ..()
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) if(level == 1 && !T.is_plating()) hide(1)
update_icon() update_icon()
hidden hidden

View File

@@ -1,8 +1,7 @@
/obj/machinery/atmospherics/pipe /obj/machinery/atmospherics/pipe
var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke
var/datum/pipeline/parent var/datum/pipeline/parent
var/volume = 0 var/volume = 0
force = 20 force = 20
@@ -20,10 +19,12 @@
return -1 return -1
/obj/machinery/atmospherics/pipe/New() /obj/machinery/atmospherics/pipe/New()
..()
//so pipes under walls are hidden
if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/simulated/shuttle/wall) || istype(get_turf(src), /turf/unsimulated/wall)) if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/simulated/shuttle/wall) || istype(get_turf(src), /turf/unsimulated/wall))
level = 1 level = 1
..()
/obj/machinery/atmospherics/pipe/hides_under_flooring()
return level != 2
/obj/machinery/atmospherics/pipe/proc/pipeline_expansion() /obj/machinery/atmospherics/pipe/proc/pipeline_expansion()
return null return null
@@ -81,7 +82,7 @@
if (!istype(W, /obj/item/weapon/wrench)) if (!istype(W, /obj/item/weapon/wrench))
return ..() return ..()
var/turf/T = src.loc var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact) if (level==1 && isturf(T) && !T.is_plating())
user << "<span class='warning'>You must remove the plating first.</span>" user << "<span class='warning'>You must remove the plating first.</span>"
return 1 return 1
var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/int_air = return_air()
@@ -188,7 +189,7 @@
initialize_directions = SOUTH|WEST initialize_directions = SOUTH|WEST
/obj/machinery/atmospherics/pipe/simple/hide(var/i) /obj/machinery/atmospherics/pipe/simple/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated)) if(istype(loc, /turf/simulated))
invisibility = i ? 101 : 0 invisibility = i ? 101 : 0
update_icon() update_icon()
@@ -297,9 +298,8 @@
qdel(src) qdel(src)
return return
var/turf/T = get_turf(src) var/turf/T = loc
if(istype(T)) if(level == 1 && !T.is_plating()) hide(1)
hide(T.intact)
update_icon() update_icon()
/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) /obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference)
@@ -348,8 +348,8 @@
/obj/machinery/atmospherics/pipe/simple/visible/green /obj/machinery/atmospherics/pipe/simple/visible/green
color = PIPE_COLOR_GREEN color = PIPE_COLOR_GREEN
/obj/machinery/atmospherics/pipe/simple/visible/purple /obj/machinery/atmospherics/pipe/simple/visible/black
color = PIPE_COLOR_PURPLE color = PIPE_COLOR_BLACK
/obj/machinery/atmospherics/pipe/simple/visible/red /obj/machinery/atmospherics/pipe/simple/visible/red
color = PIPE_COLOR_RED color = PIPE_COLOR_RED
@@ -390,8 +390,8 @@
/obj/machinery/atmospherics/pipe/simple/hidden/green /obj/machinery/atmospherics/pipe/simple/hidden/green
color = PIPE_COLOR_GREEN color = PIPE_COLOR_GREEN
/obj/machinery/atmospherics/pipe/simple/hidden/purple /obj/machinery/atmospherics/pipe/simple/hidden/black
color = PIPE_COLOR_PURPLE color = PIPE_COLOR_BLACK
/obj/machinery/atmospherics/pipe/simple/hidden/red /obj/machinery/atmospherics/pipe/simple/hidden/red
color = PIPE_COLOR_RED color = PIPE_COLOR_RED
@@ -446,7 +446,7 @@
initialize_directions = NORTH|EAST|SOUTH initialize_directions = NORTH|EAST|SOUTH
/obj/machinery/atmospherics/pipe/manifold/hide(var/i) /obj/machinery/atmospherics/pipe/manifold/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated)) if(istype(loc, /turf/simulated))
invisibility = i ? 101 : 0 invisibility = i ? 101 : 0
update_icon() update_icon()
@@ -582,8 +582,7 @@
return return
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(istype(T)) if(level == 1 && !T.is_plating()) hide(1)
hide(T.intact)
update_icon() update_icon()
/obj/machinery/atmospherics/pipe/manifold/visible /obj/machinery/atmospherics/pipe/manifold/visible
@@ -617,8 +616,8 @@
/obj/machinery/atmospherics/pipe/manifold/visible/green /obj/machinery/atmospherics/pipe/manifold/visible/green
color = PIPE_COLOR_GREEN color = PIPE_COLOR_GREEN
/obj/machinery/atmospherics/pipe/manifold/visible/purple /obj/machinery/atmospherics/pipe/manifold/visible/black
color = PIPE_COLOR_PURPLE color = PIPE_COLOR_BLACK
/obj/machinery/atmospherics/pipe/manifold/visible/red /obj/machinery/atmospherics/pipe/manifold/visible/red
color = PIPE_COLOR_RED color = PIPE_COLOR_RED
@@ -659,8 +658,8 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/green /obj/machinery/atmospherics/pipe/manifold/hidden/green
color = PIPE_COLOR_GREEN color = PIPE_COLOR_GREEN
/obj/machinery/atmospherics/pipe/manifold/hidden/purple /obj/machinery/atmospherics/pipe/manifold/hidden/black
color = PIPE_COLOR_PURPLE color = PIPE_COLOR_BLACK
/obj/machinery/atmospherics/pipe/manifold/hidden/red /obj/machinery/atmospherics/pipe/manifold/hidden/red
color = PIPE_COLOR_RED color = PIPE_COLOR_RED
@@ -806,7 +805,7 @@
update_icon() update_icon()
/obj/machinery/atmospherics/pipe/manifold4w/hide(var/i) /obj/machinery/atmospherics/pipe/manifold4w/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated)) if(istype(loc, /turf/simulated))
invisibility = i ? 101 : 0 invisibility = i ? 101 : 0
update_icon() update_icon()
@@ -841,8 +840,7 @@
return return
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(istype(T)) if(level == 1 && !T.is_plating()) hide(1)
hide(T.intact)
update_icon() update_icon()
/obj/machinery/atmospherics/pipe/manifold4w/visible /obj/machinery/atmospherics/pipe/manifold4w/visible
@@ -876,8 +874,8 @@
/obj/machinery/atmospherics/pipe/manifold4w/visible/green /obj/machinery/atmospherics/pipe/manifold4w/visible/green
color = PIPE_COLOR_GREEN color = PIPE_COLOR_GREEN
/obj/machinery/atmospherics/pipe/manifold4w/visible/purple /obj/machinery/atmospherics/pipe/manifold4w/visible/black
color = PIPE_COLOR_PURPLE color = PIPE_COLOR_BLACK
/obj/machinery/atmospherics/pipe/manifold4w/visible/red /obj/machinery/atmospherics/pipe/manifold4w/visible/red
color = PIPE_COLOR_RED color = PIPE_COLOR_RED
@@ -917,8 +915,8 @@
/obj/machinery/atmospherics/pipe/manifold4w/hidden/green /obj/machinery/atmospherics/pipe/manifold4w/hidden/green
color = PIPE_COLOR_GREEN color = PIPE_COLOR_GREEN
/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple /obj/machinery/atmospherics/pipe/manifold4w/hidden/black
color = PIPE_COLOR_PURPLE color = PIPE_COLOR_BLACK
/obj/machinery/atmospherics/pipe/manifold4w/hidden/red /obj/machinery/atmospherics/pipe/manifold4w/hidden/red
color = PIPE_COLOR_RED color = PIPE_COLOR_RED
@@ -946,7 +944,7 @@
initialize_directions = dir initialize_directions = dir
/obj/machinery/atmospherics/pipe/cap/hide(var/i) /obj/machinery/atmospherics/pipe/cap/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated)) if(istype(loc, /turf/simulated))
invisibility = i ? 101 : 0 invisibility = i ? 101 : 0
update_icon() update_icon()
@@ -997,7 +995,7 @@
break break
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) if(level == 1 && !T.is_plating()) hide(1)
update_icon() update_icon()
/obj/machinery/atmospherics/pipe/cap/visible /obj/machinery/atmospherics/pipe/cap/visible
@@ -1120,20 +1118,8 @@
return return
if(istype(W, /obj/item/device/analyzer) && in_range(user, src)) if(istype(W, /obj/item/device/analyzer) && in_range(user, src))
for (var/mob/O in viewers(user, null)) var/obj/item/device/analyzer/A = W
O << "<span class='notice'>\The [user] has used \the [W] on \the [src] \icon[src]</span>" A.analyze_gases(src, user)
var/pressure = parent.air.return_pressure()
var/total_moles = parent.air.total_moles
user << "<span class='notice'>Results of analysis of \the [src] \icon[src]</span>"
if (total_moles>0)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/g in parent.air.gas)
user << "<span class='notice'>[gas_data.name[g]]: [round((parent.air.gas[g] / total_moles) * 100)]%</span>"
user << "<span class='notice'>Temperature: [round(parent.air.temperature-T0C)]&deg;C</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
/obj/machinery/atmospherics/pipe/tank/air /obj/machinery/atmospherics/pipe/tank/air
name = "Pressure Tank (Air)" name = "Pressure Tank (Air)"
@@ -1398,7 +1384,7 @@
/obj/machinery/atmospherics/proc/add_underlay_adapter(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) //modified from add_underlay, does not make exposed underlays /obj/machinery/atmospherics/proc/add_underlay_adapter(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) //modified from add_underlay, does not make exposed underlays
if(node) if(node)
if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) if(!T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe))
underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type)
else else
underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type)

View File

@@ -46,8 +46,8 @@ obj/machinery/atmospherics/pipe/zpipe/New()
if(SOUTHWEST) if(SOUTHWEST)
initialize_directions = SOUTH initialize_directions = SOUTH
obj/machinery/atmospherics/pipe/zpipe/hide(var/i) /obj/machinery/atmospherics/pipe/zpipe/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated)) if(istype(loc, /turf/simulated))
invisibility = i ? 101 : 0 invisibility = i ? 101 : 0
update_icon() update_icon()
@@ -149,7 +149,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/initialize()
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) hide(!T.is_plating())
/////////////////////// ///////////////////////
// and the down pipe // // and the down pipe //
@@ -190,7 +190,7 @@ obj/machinery/atmospherics/pipe/zpipe/down/initialize()
var/turf/T = src.loc // hide if turf is not intact var/turf/T = src.loc // hide if turf is not intact
hide(T.intact) hide(!T.is_plating())
/////////////////////// ///////////////////////
// supply/scrubbers // // supply/scrubbers //

View File

@@ -1,6 +1,5 @@
/turf/simulated/floor/open /turf/simulated/floor/open
name = "open space" name = "open space"
intact = 0
density = 0 density = 0
icon_state = "black" icon_state = "black"
pathweight = 100000 //Seriously, don't try and path over this one numbnuts pathweight = 100000 //Seriously, don't try and path over this one numbnuts
@@ -81,8 +80,7 @@
// override to make sure nothing is hidden // override to make sure nothing is hidden
/turf/simulated/floor/open/levelupdate() /turf/simulated/floor/open/levelupdate()
for(var/obj/O in src) for(var/obj/O in src)
if(O.level == 1) O.hide(0)
O.hide(0)
//overwrite the attackby of space to transform it to openspace if necessary //overwrite the attackby of space to transform it to openspace if necessary
/turf/space/attackby(obj/item/C as obj, mob/user as mob) /turf/space/attackby(obj/item/C as obj, mob/user as mob)
@@ -114,16 +112,16 @@
ReplaceWithLattice() ReplaceWithLattice()
return return
if (istype(C, /obj/item/stack/tile/steel)) if (istype(C, /obj/item/stack/tile/floor))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L) if(L)
var/obj/item/stack/tile/steel/S = C var/obj/item/stack/tile/floor/S = C
if (S.get_amount() < 1) if (S.get_amount() < 1)
return return
qdel(L) qdel(L)
playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1)
S.build(src)
S.use(1) S.use(1)
ChangeTurf(/turf/simulated/floor/airless)
return return
else else
user << "<span class='warning'>The plating is going to need some support.</span>" user << "<span class='warning'>The plating is going to need some support.</span>"

View File

@@ -19,12 +19,12 @@ mob/proc/airflow_stun()
mob/living/silicon/airflow_stun() mob/living/silicon/airflow_stun()
return return
mob/living/carbon/metroid/airflow_stun() mob/living/carbon/slime/airflow_stun()
return return
mob/living/carbon/human/airflow_stun() mob/living/carbon/human/airflow_stun()
if(shoes) if(shoes)
if(shoes.flags & NOSLIP) return 0 if(shoes.item_flags & NOSLIP) return 0
..() ..()
atom/movable/proc/check_airflow_movable(n) atom/movable/proc/check_airflow_movable(n)
@@ -62,6 +62,19 @@ obj/item/check_airflow_movable(n)
/atom/movable/var/tmp/airflow_time = 0 /atom/movable/var/tmp/airflow_time = 0
/atom/movable/var/tmp/last_airflow = 0 /atom/movable/var/tmp/last_airflow = 0
/atom/movable/proc/AirflowCanMove(n)
return 1
/mob/AirflowCanMove(n)
if(status_flags & GODMODE)
return 0
if(buckled)
return 0
var/obj/item/shoes = get_equipped_item(slot_shoes)
if(istype(shoes) && (shoes.item_flags & NOSLIP))
return 0
return 1
/atom/movable/proc/GotoAirflowDest(n) /atom/movable/proc/GotoAirflowDest(n)
if(!airflow_dest) return if(!airflow_dest) return
if(airflow_speed < 0) return if(airflow_speed < 0) return
@@ -69,18 +82,13 @@ obj/item/check_airflow_movable(n)
if(airflow_speed) if(airflow_speed)
airflow_speed = n/max(get_dist(src,airflow_dest),1) airflow_speed = n/max(get_dist(src,airflow_dest),1)
return return
last_airflow = world.time
if(airflow_dest == loc) if(airflow_dest == loc)
step_away(src,loc) step_away(src,loc)
if(!src.AirflowCanMove(n))
return
if(ismob(src)) if(ismob(src))
if(src:status_flags & GODMODE)
return
if(istype(src, /mob/living/carbon/human))
if(src:buckled)
return
if(src:shoes && src:shoes.flags & NOSLIP)
return
src << "<span class='danger'>You are sucked away by airflow!</span>" src << "<span class='danger'>You are sucked away by airflow!</span>"
last_airflow = world.time
var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2)
if(airflow_falloff < 1) if(airflow_falloff < 1)
airflow_dest = null airflow_dest = null
@@ -116,8 +124,9 @@ obj/item/check_airflow_movable(n)
if(!istype(loc, /turf)) if(!istype(loc, /turf))
break break
step_towards(src, src.airflow_dest) step_towards(src, src.airflow_dest)
if(ismob(src) && src:client) var/mob/M = src
src:client:move_delay = world.time + vsc.airflow_mob_slowdown if(istype(M) && M.client)
M.setMoveCooldown(vsc.airflow_mob_slowdown)
airflow_dest = null airflow_dest = null
airflow_speed = 0 airflow_speed = 0
airflow_time = 0 airflow_time = 0
@@ -134,18 +143,11 @@ obj/item/check_airflow_movable(n)
return return
if(airflow_dest == loc) if(airflow_dest == loc)
step_away(src,loc) step_away(src,loc)
if(!src.AirflowCanMove(n))
return
if(ismob(src)) if(ismob(src))
if(src:status_flags & GODMODE)
return
if(istype(src, /mob/living/carbon/human))
if(src:buckled)
return
if(src:shoes)
if(istype(src:shoes, /obj/item/clothing/shoes/magboots))
if(src:shoes.flags & NOSLIP)
return
src << "<span clas='danger'>You are pushed away by airflow!</span>" src << "<span clas='danger'>You are pushed away by airflow!</span>"
last_airflow = world.time last_airflow = world.time
var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2)
if(airflow_falloff < 1) if(airflow_falloff < 1)
airflow_dest = null airflow_dest = null
@@ -241,7 +243,7 @@ mob/living/carbon/human/airflow_hit(atom/A)
zone/proc/movables() zone/proc/movables()
. = list() . = list()
for(var/turf/T in contents) for(var/turf/T in contents)
for(var/atom/A in T) for(var/atom/movable/A in T)
if(istype(A, /obj/effect) || istype(A, /mob/aiEye)) if(!A.simulated || A.anchored || istype(A, /obj/effect) || istype(A, /mob/eye))
continue continue
. += A . += A

View File

@@ -281,8 +281,8 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
var/direct = !(block & ZONE_BLOCKED) var/direct = !(block & ZONE_BLOCKED)
var/space = !istype(B) var/space = !istype(B)
if(direct && !space) if(!space)
if(min(A.zone.contents.len, B.zone.contents.len) <= ZONE_MIN_SIZE || equivalent_pressure(A.zone,B.zone) || current_cycle == 0) if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || current_cycle == 0)))
merge(A.zone,B.zone) merge(A.zone,B.zone)
return return

View File

@@ -295,7 +295,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out //if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out
if(zone) //be less restrictive with canister and tank reactions if(zone) //be less restrictive with canister and tank reactions
if((!liquid_fuel || used_fuel <= FIRE_LIQUD_MIN_BURNRATE) && (!gas_fuel || used_fuel <= FIRE_GAS_MIN_BURNRATE*group_multiplier)) if((!liquid_fuel || used_fuel <= FIRE_LIQUD_MIN_BURNRATE) && (!gas_fuel || used_fuel <= FIRE_GAS_MIN_BURNRATE*zone.contents.len))
return 0 return 0

View File

@@ -97,14 +97,14 @@ obj/var/contaminated = 0
if(!wear_mask) if(!wear_mask)
burn_eyes() burn_eyes()
else else
if(!(wear_mask.flags & MASKCOVERSEYES)) if(!(wear_mask.body_parts_covered & EYES))
burn_eyes() burn_eyes()
else else
if(!(head.flags & HEADCOVERSEYES)) if(!(head.body_parts_covered & EYES))
if(!wear_mask) if(!wear_mask)
burn_eyes() burn_eyes()
else else
if(!(wear_mask.flags & MASKCOVERSEYES)) if(!(wear_mask.body_parts_covered & EYES))
burn_eyes() burn_eyes()
//Genetic Corruption //Genetic Corruption
@@ -135,19 +135,24 @@ obj/var/contaminated = 0
if(vsc.plc.PHORONGUARD_ONLY) if(vsc.plc.PHORONGUARD_ONLY)
if(head.flags & PHORONGUARD) if(head.flags & PHORONGUARD)
return 1 return 1
else if(head.flags & HEADCOVERSEYES) else if(head.body_parts_covered & EYES)
return 1 return 1
return 0 return 0
/mob/living/carbon/human/proc/pl_suit_protected() /mob/living/carbon/human/proc/pl_suit_protected()
//Checks if the suit is adequately sealed. //Checks if the suit is adequately sealed.
if(wear_suit) var/coverage = 0
if(vsc.plc.PHORONGUARD_ONLY) for(var/obj/item/protection in list(wear_suit, gloves, shoes))
if(wear_suit.flags & PHORONGUARD) return 1 if(!protection)
else continue
if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1 if(vsc.plc.PHORONGUARD_ONLY && !(protection.flags & PHORONGUARD))
//should check HIDETAIL as well, but for the moment tails are not a part that can be damaged separately return 0
return 0 coverage |= protection.body_parts_covered
if(vsc.plc.PHORONGUARD_ONLY)
return 1
return BIT_TEST_ALL(coverage, UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS)
/mob/living/carbon/human/proc/suit_contamination() /mob/living/carbon/human/proc/suit_contamination()
//Runs over the things that can be contaminated and does so. //Runs over the things that can be contaminated and does so.

View File

@@ -1,12 +1,12 @@
// A set of constants used to determine which type of mute an admin wishes to apply. // A set of constants used to determine which type of mute an admin wishes to apply.
// Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO, etc. = (MUTE_IC << 1) // Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO, etc. = (MUTE_IC << 1)
// Therefore there needs to be a gap between the flags for the automute flags. // Therefore there needs to be a gap between the flags for the automute flags.
#define MUTE_IC 1 #define MUTE_IC 0x1
#define MUTE_OOC 2 #define MUTE_OOC 0x2
#define MUTE_PRAY 4 #define MUTE_PRAY 0x4
#define MUTE_ADMINHELP 8 #define MUTE_ADMINHELP 0x8
#define MUTE_DEADCHAT 16 #define MUTE_DEADCHAT 0x10
#define MUTE_ALL 31 #define MUTE_ALL 0xFFFF
// Number of identical messages required to get the spam-prevention auto-mute thing to trigger warnings and automutes. // Number of identical messages required to get the spam-prevention auto-mute thing to trigger warnings and automutes.
#define SPAM_TRIGGER_WARNING 5 #define SPAM_TRIGGER_WARNING 5
@@ -21,22 +21,22 @@
#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 // Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. #define ROUNDSTART_LOGOUT_REPORT_TIME 6000 // Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued.
// Admin permissions. Please don't edit these values without speaking to Errorage first. ~Carn // Admin permissions.
#define R_BUILDMODE 1 #define R_BUILDMODE 0x1
#define R_ADMIN 2 #define R_ADMIN 0x2
#define R_BAN 4 #define R_BAN 0x4
#define R_FUN 8 #define R_FUN 0x8
#define R_SERVER 16 #define R_SERVER 0x10
#define R_DEBUG 32 #define R_DEBUG 0x20
#define R_POSSESS 64 #define R_POSSESS 0x40
#define R_PERMISSIONS 128 #define R_PERMISSIONS 0x80
#define R_STEALTH 256 #define R_STEALTH 0x100
#define R_REJUVINATE 512 #define R_REJUVINATE 0x200
#define R_VAREDIT 1024 #define R_VAREDIT 0x400
#define R_SOUNDS 2048 #define R_SOUNDS 0x800
#define R_SPAWN 4096 #define R_SPAWN 0x1000
#define R_MOD 8192 #define R_MOD 0x2000
#define R_MENTOR 16384 #define R_MENTOR 0x4000
#define R_HOST 32768 #define R_HOST 0x8000 //higher than this will overflow
#define R_MAXPERMISSION 32768 // This holds the maximum value for a permission. It is used in iteration, so keep it updated. #define R_MAXPERMISSION 0x8000 // This holds the maximum value for a permission. It is used in iteration, so keep it updated.

View File

@@ -8,6 +8,8 @@
#define MOLES_PHORON_VISIBLE 0.7 // Moles in a standard cell after which phoron is visible. #define MOLES_PHORON_VISIBLE 0.7 // Moles in a standard cell after which phoron is visible.
#define MOLES_O2STANDARD (MOLES_CELLSTANDARD * O2STANDARD) // O2 standard value (21%) #define MOLES_O2STANDARD (MOLES_CELLSTANDARD * O2STANDARD) // O2 standard value (21%)
#define MOLES_N2STANDARD (MOLES_CELLSTANDARD * N2STANDARD) // N2 standard value (79%) #define MOLES_N2STANDARD (MOLES_CELLSTANDARD * N2STANDARD) // N2 standard value (79%)
#define MOLES_O2ATMOS (MOLES_O2STANDARD*50)
#define MOLES_N2ATMOS (MOLES_N2STANDARD*50)
// These are for when a mob breathes poisonous air. // These are for when a mob breathes poisonous air.
#define MIN_TOXIN_DAMAGE 1 #define MIN_TOXIN_DAMAGE 1
@@ -83,4 +85,4 @@
//Flags for zone sleeping //Flags for zone sleeping
#define ZONE_ACTIVE 1 #define ZONE_ACTIVE 1
#define ZONE_SLEEPING 0 #define ZONE_SLEEPING 0

View File

@@ -21,10 +21,10 @@
#define DROWSY "drowsy" #define DROWSY "drowsy"
// I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches. // I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches.
#define BRUTELOSS 1 #define BRUTELOSS 0x1
#define FIRELOSS 2 #define FIRELOSS 0x2
#define TOXLOSS 4 #define TOXLOSS 0x4
#define OXYLOSS 8 #define OXYLOSS 0x8
#define FIRE_DAMAGE_MODIFIER 0.0215 // Higher values result in more external fire damage to the skin. (default 0.0215) #define FIRE_DAMAGE_MODIFIER 0.0215 // Higher values result in more external fire damage to the skin. (default 0.0215)
#define AIR_DAMAGE_MODIFIER 2.025 // More means less damage from hot air scalding lungs, less = more damage. (default 2.025) #define AIR_DAMAGE_MODIFIER 2.025 // More means less damage from hot air scalding lungs, less = more damage. (default 2.025)
@@ -53,4 +53,4 @@
#define INFECTION_LEVEL_ONE 100 #define INFECTION_LEVEL_ONE 100
#define INFECTION_LEVEL_TWO 500 #define INFECTION_LEVEL_TWO 500
#define INFECTION_LEVEL_THREE 1000 #define INFECTION_LEVEL_THREE 1000

View File

@@ -31,16 +31,16 @@
#define mSmallsize 110 // Table climbing. #define mSmallsize 110 // Table climbing.
// disabilities // disabilities
#define NEARSIGHTED 1 #define NEARSIGHTED 0x1
#define EPILEPSY 2 #define EPILEPSY 0x2
#define COUGHING 4 #define COUGHING 0x4
#define TOURETTES 8 #define TOURETTES 0x8
#define NERVOUS 16 #define NERVOUS 0x10
// sdisabilities // sdisabilities
#define BLIND 1 #define BLIND 0x1
#define MUTE 2 #define MUTE 0x2
#define DEAF 4 #define DEAF 0x4
// The way blocks are handled badly needs a rewrite, this is horrible. // The way blocks are handled badly needs a rewrite, this is horrible.
// Too much of a project to handle at the moment, TODO for later. // Too much of a project to handle at the moment, TODO for later.

View File

@@ -9,21 +9,21 @@
#define SEC_LEVEL_RED 2 #define SEC_LEVEL_RED 2
#define SEC_LEVEL_DELTA 3 #define SEC_LEVEL_DELTA 3
#define BE_TRAITOR 1 #define BE_TRAITOR 0x1
#define BE_OPERATIVE 2 #define BE_OPERATIVE 0x2
#define BE_CHANGELING 4 #define BE_CHANGELING 0x4
#define BE_WIZARD 8 #define BE_WIZARD 0x8
#define BE_MALF 16 #define BE_MALF 0x10
#define BE_REV 32 #define BE_REV 0x20
#define BE_ALIEN 64 #define BE_ALIEN 0x40
#define BE_AI 128 #define BE_AI 0x80
#define BE_CULTIST 256 #define BE_CULTIST 0x100
#define BE_MONKEY 512 #define BE_MONKEY 0x200
#define BE_NINJA 1024 #define BE_NINJA 0x400
#define BE_RAIDER 2048 #define BE_RAIDER 0x800
#define BE_PLANT 4096 #define BE_PLANT 0x1000
#define BE_MUTINEER 8192 #define BE_MUTINEER 0x2000
#define BE_PAI 16384 #define BE_PAI 0x4000
var/list/be_special_flags = list( var/list/be_special_flags = list(
"Traitor" = BE_TRAITOR, "Traitor" = BE_TRAITOR,
@@ -47,17 +47,17 @@ var/list/be_special_flags = list(
// Antagonist datum flags. // Antagonist datum flags.
#define ANTAG_OVERRIDE_JOB 1 // Assigned job is set to MODE when spawning. #define ANTAG_OVERRIDE_JOB 0x1 // Assigned job is set to MODE when spawning.
#define ANTAG_OVERRIDE_MOB 2 // Mob is recreated from datum mob_type var when spawning. #define ANTAG_OVERRIDE_MOB 0x2 // Mob is recreated from datum mob_type var when spawning.
#define ANTAG_CLEAR_EQUIPMENT 4 // All preexisting equipment is purged. #define ANTAG_CLEAR_EQUIPMENT 0x4 // All preexisting equipment is purged.
#define ANTAG_CHOOSE_NAME 8 // Antagonists are prompted to enter a name. #define ANTAG_CHOOSE_NAME 0x8 // Antagonists are prompted to enter a name.
#define ANTAG_IMPLANT_IMMUNE 16 // Cannot be loyalty implanted. #define ANTAG_IMPLANT_IMMUNE 0x10 // Cannot be loyalty implanted.
#define ANTAG_SUSPICIOUS 32 // Shows up on roundstart report. #define ANTAG_SUSPICIOUS 0x20 // Shows up on roundstart report.
#define ANTAG_HAS_LEADER 64 // Generates a leader antagonist. #define ANTAG_HAS_LEADER 0x40 // Generates a leader antagonist.
#define ANTAG_HAS_NUKE 128 // Will spawn a nuke at supplied location. #define ANTAG_HAS_NUKE 0x80 // Will spawn a nuke at supplied location.
#define ANTAG_RANDSPAWN 256 // Potentially randomly spawns due to events. #define ANTAG_RANDSPAWN 0x100 // Potentially randomly spawns due to events.
#define ANTAG_VOTABLE 512 // Can be voted as an additional antagonist before roundstart. #define ANTAG_VOTABLE 0x200 // Can be voted as an additional antagonist before roundstart.
#define ANTAG_SET_APPEARANCE 1024 // Causes antagonists to use an appearance modifier on spawn. #define ANTAG_SET_APPEARANCE 0x400 // Causes antagonists to use an appearance modifier on spawn.
// Mode/antag template macros. // Mode/antag template macros.
#define MODE_BORER "borer" #define MODE_BORER "borer"
@@ -87,22 +87,22 @@ var/list/be_special_flags = list(
///////////////// /////////////////
/* WIZARD SPELL FLAGS */ /* WIZARD SPELL FLAGS */
#define GHOSTCAST 1 //can a ghost cast it? #define GHOSTCAST 0x1 //can a ghost cast it?
#define NEEDSCLOTHES 2 //does it need the wizard garb to cast? Nonwizard spells should not have this #define NEEDSCLOTHES 0x2 //does it need the wizard garb to cast? Nonwizard spells should not have this
#define NEEDSHUMAN 4 //does it require the caster to be human? #define NEEDSHUMAN 0x4 //does it require the caster to be human?
#define Z2NOCAST 8 //if this is added, the spell can't be cast at centcomm #define Z2NOCAST 0x8 //if this is added, the spell can't be cast at centcomm
#define STATALLOWED 16 //if set, the user doesn't have to be conscious to cast. Required for ghost spells #define STATALLOWED 0x10 //if set, the user doesn't have to be conscious to cast. Required for ghost spells
#define IGNOREPREV 32 //if set, each new target does not overlap with the previous one #define IGNOREPREV 0x20 //if set, each new target does not overlap with the previous one
//The following flags only affect different types of spell, and therefore overlap //The following flags only affect different types of spell, and therefore overlap
//Targeted spells //Targeted spells
#define INCLUDEUSER 64 //does the spell include the caster in its target selection? #define INCLUDEUSER 0x40 //does the spell include the caster in its target selection?
#define SELECTABLE 128 //can you select each target for the spell? #define SELECTABLE 0x80 //can you select each target for the spell?
//AOE spells //AOE spells
#define IGNOREDENSE 64 //are dense turfs ignored in selection? #define IGNOREDENSE 0x40 //are dense turfs ignored in selection?
#define IGNORESPACE 128 //are space turfs ignored in selection? #define IGNORESPACE 0x80 //are space turfs ignored in selection?
//End split flags //End split flags
#define CONSTRUCT_CHECK 256 //used by construct spells - checks for nullrods #define CONSTRUCT_CHECK 0x100 //used by construct spells - checks for nullrods
#define NO_BUTTON 512 //spell won't show up in the HUD with this #define NO_BUTTON 0x200 //spell won't show up in the HUD with this
//invocation //invocation
#define SpI_SHOUT "shout" #define SpI_SHOUT "shout"

View File

@@ -5,71 +5,63 @@
#define CANDLE_LUM 3 // For how bright candles are. #define CANDLE_LUM 3 // For how bright candles are.
// Item inventory slot bitmasks. // Item inventory slot bitmasks.
#define SLOT_OCLOTHING 1 #define SLOT_OCLOTHING 0x1
#define SLOT_ICLOTHING 2 #define SLOT_ICLOTHING 0x2
#define SLOT_GLOVES 4 #define SLOT_GLOVES 0x4
#define SLOT_EYES 8 #define SLOT_EYES 0x8
#define SLOT_EARS 16 #define SLOT_EARS 0x10
#define SLOT_MASK 32 #define SLOT_MASK 0x20
#define SLOT_HEAD 64 #define SLOT_HEAD 0x40
#define SLOT_FEET 128 #define SLOT_FEET 0x80
#define SLOT_ID 256 #define SLOT_ID 0x100
#define SLOT_BELT 512 #define SLOT_BELT 0x200
#define SLOT_BACK 1024 #define SLOT_BACK 0x400
#define SLOT_POCKET 2048 // This is to allow items with a w_class of 3 or 4 to fit in pockets. #define SLOT_POCKET 0x800 // This is to allow items with a w_class of 3 or 4 to fit in pockets.
#define SLOT_DENYPOCKET 4096 // This is to deny items with a w_class of 2 or 1 from fitting in pockets. #define SLOT_DENYPOCKET 0x1000 // This is to deny items with a w_class of 2 or 1 from fitting in pockets.
#define SLOT_TWOEARS 8192 #define SLOT_TWOEARS 0x2000
#define SLOT_TIE 16384 #define SLOT_TIE 0x4000
#define SLOT_HOLSTER 32768 //16th bit #define SLOT_HOLSTER 0x8000 //16th bit - higher than this will overflow
// Flags bitmasks. // Flags bitmasks.
#define STOPPRESSUREDAMAGE 1 // This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere #define NOBLUDGEON 0x1 // When an item has this it produces no "X has been hit by Y with Z" message with the default handler.
// To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. #define CONDUCT 0x2 // Conducts electricity. (metal etc.)
#define NOBLUDGEON 2 // When an item has this it produces no "X has been hit by Y with Z" message with the default handler. #define ON_BORDER 0x4 // Item has priority to check when entering or leaving.
#define AIRTIGHT 4 // Functions with internals. #define NOBLOODY 0x8 // Used for items if they don't want to get a blood overlay.
#define USEDELAY 8 // 1 second extra delay on use. (Can be used once every 2s) #define OPENCONTAINER 0x10 // Is an open container for chemistry purposes.
#define NOSHIELD 16 // Weapon not affected by shield. #define PHORONGUARD 0x20 // Does not get contaminated by phoron.
#define CONDUCT 32 // Conducts electricity. (metal etc.) #define NOREACT 0x40 // Reagents don't react inside this container.
#define ON_BORDER 64 // Item has priority to check when entering or leaving. #define PROXMOVE 0x80 // Does this object require proximity checking in Enter()?
#define NOBLOODY 512 // Used for items if they don't want to get a blood overlay.
#define NODELAY 8192 // 1 second attack-by delay skipped (Can be used once every 0.2s). Most objects have a 1s attack-by delay, which doesn't require a flag.
//Use these flags to indicate if an item obscures the specified slots from view, whereas body_parts_covered seems to be used to indicate what body parts the item protects. //Flags for items (equipment)
#define GLASSESCOVERSEYES 256 #define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equiped to slot_suit or slot_head.
#define MASKCOVERSEYES 256 // Get rid of some of the other retardation in these flags. #define STOPPRESSUREDAMAGE 0x2 // Counts towards pressure protection. Note that like temperature protection, body_parts_covered is considered here as well.
#define HEADCOVERSEYES 256 // Feel free to reallocate these numbers for other purposes. #define AIRTIGHT 0x4 // Functions with internals.
#define MASKCOVERSMOUTH 512 // On other items, these are just for mask/head. #define NOSLIP 0x8 // Prevents from slipping on wet floors, in space, etc.
#define HEADCOVERSMOUTH 512 #define BLOCK_GAS_SMOKE_EFFECT 0x10 // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
#define FLEXIBLEMATERIAL 0x20 // At the moment, masks with this flag will not prevent eating even if they are covering your face.
#define THICKMATERIAL 256 // From /tg/station: prevents syringes, parapens and hyposprays if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP for shoes)
#define NOSLIP 256 // Prevents from slipping on wet floors, in space, etc.
#define OPENCONTAINER 1024 // Is an open container for chemistry purposes.
#define BLOCK_GAS_SMOKE_EFFECT 2048 // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
#define ONESIZEFITSALL 2048
#define PHORONGUARD 4096 // Does not get contaminated by phoron.
#define NOREACT 4096 // Reagents don't react inside this container.
#define BLOCKHEADHAIR 4 // Temporarily removes the user's hair overlay. Leaves facial hair.
#define BLOCKHAIR 8192 // Temporarily removes the user's hair, facial and otherwise.
// Flags for pass_flags. // Flags for pass_flags.
#define PASSTABLE 1 #define PASSTABLE 0x1
#define PASSGLASS 2 #define PASSGLASS 0x2
#define PASSGRILLE 4 #define PASSGRILLE 0x4
#define PASSBLOB 8 #define PASSBLOB 0x8
// Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. // Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses.
// WARNING: The following flags apply only to the external suit! // WARNING: The following flags apply only to the external suit!
#define HIDEGLOVES 1 #define HIDEGLOVES 0x1
#define HIDESUITSTORAGE 2 #define HIDESUITSTORAGE 0x2
#define HIDEJUMPSUIT 4 #define HIDEJUMPSUIT 0x4
#define HIDESHOES 8 #define HIDESHOES 0x8
#define HIDETAIL 16 #define HIDETAIL 0x10
// WARNING: The following flags apply only to the helmets and masks! // WARNING: The following flags apply only to the helmets and masks!
#define HIDEMASK 1 #define HIDEMASK 0x1
#define HIDEEARS 2 // Headsets and such. #define HIDEEARS 0x2 // Headsets and such.
#define HIDEEYES 4 // Glasses. #define HIDEEYES 0x4 // Glasses.
#define HIDEFACE 8 // Dictates whether we appear as "Unknown". #define HIDEFACE 0x8 // Dictates whether we appear as "Unknown".
#define BLOCKHEADHAIR 0x20 // Hides the user's hair overlay. Leaves facial hair.
#define BLOCKHAIR 0x40 // Hides the user's hair, facial and otherwise.
// Slots. // Slots.
#define slot_back 1 #define slot_back 1
@@ -106,24 +98,24 @@
#define slot_wear_suit_str "slot_suit" #define slot_wear_suit_str "slot_suit"
// Bitflags for clothing parts. // Bitflags for clothing parts.
#define HEAD 1 #define HEAD 0x1
#define FACE 2 #define FACE 0x2
#define EYES 4 #define EYES 0x4
#define UPPER_TORSO 8 #define UPPER_TORSO 0x8
#define LOWER_TORSO 16 #define LOWER_TORSO 0x10
#define LEG_LEFT 32 #define LEG_LEFT 0x20
#define LEG_RIGHT 64 #define LEG_RIGHT 0x40
#define LEGS 96 // LEG_LEFT | LEG_RIGHT #define LEGS 0x60 // LEG_LEFT | LEG_RIGHT
#define FOOT_LEFT 128 #define FOOT_LEFT 0x80
#define FOOT_RIGHT 256 #define FOOT_RIGHT 0x100
#define FEET 384 // FOOT_LEFT | FOOT_RIGHT #define FEET 0x180 // FOOT_LEFT | FOOT_RIGHT
#define ARM_LEFT 512 #define ARM_LEFT 0x200
#define ARM_RIGHT 1024 #define ARM_RIGHT 0x400
#define ARMS 1536 // ARM_LEFT | ARM_RIGHT #define ARMS 0x600 // ARM_LEFT | ARM_RIGHT
#define HAND_LEFT 2048 #define HAND_LEFT 0x800
#define HAND_RIGHT 4096 #define HAND_RIGHT 0x1000
#define HANDS 6144 // HAND_LEFT | HAND_RIGHT #define HANDS 0x1800 // HAND_LEFT | HAND_RIGHT
#define FULL_BODY 8191 #define FULL_BODY 0xFFFF
// Bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. // Bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection(). // Used with human/proc/get_heat_protection() and human/proc/get_cold_protection().
@@ -185,4 +177,4 @@
#define SUIT_SENSOR_OFF 0 #define SUIT_SENSOR_OFF 0
#define SUIT_SENSOR_BINARY 1 #define SUIT_SENSOR_BINARY 1
#define SUIT_SENSOR_VITAL 2 #define SUIT_SENSOR_VITAL 2
#define SUIT_SENSOR_TRACKING 3 #define SUIT_SENSOR_TRACKING 3

View File

@@ -0,0 +1,6 @@
#define FOR_DVIEW(type, range, center, invis_flags) \
dview_mob.loc = center; \
dview_mob.see_invisible = invis_flags; \
for(type in view(range, dview_mob))
#define END_FOR_DVIEW dview_mob.loc = null

View File

@@ -1,8 +1,7 @@
var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manually after an event. var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manually after an event.
var/CELLRATE = 0.002 // Multiplier for watts per tick <> cell storage (e.g., 0.02 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) #define CELLRATE 0.002 // Multiplier for watts per tick <> cell storage (e.g., 0.02 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
// It's a conversion constant. power_used*CELLRATE = charge_provided, or charge_used/CELLRATE = power_provided // It's a conversion constant. power_used*CELLRATE = charge_provided, or charge_used/CELLRATE = power_provided
var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (0.01 means cellcharge is capped to 1% per second)
// Doors! // Doors!
#define DOOR_CRUSH_DAMAGE 10 #define DOOR_CRUSH_DAMAGE 10
@@ -15,18 +14,15 @@ var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-t
#define TOTAL 4 // For total power used only. #define TOTAL 4 // For total power used only.
// Bitflags for machine stat variable. // Bitflags for machine stat variable.
#define BROKEN 1 #define BROKEN 0x1
#define NOPOWER 2 #define NOPOWER 0x2
#define POWEROFF 4 // TBD. #define POWEROFF 0x4 // TBD.
#define MAINT 8 // Under maintenance. #define MAINT 0x8 // Under maintenance.
#define EMPED 16 // Temporary broken by EMP pulse. #define EMPED 0x10 // Temporary broken by EMP pulse.
// Bitmasks for door switches. // Used by firelocks
#define OPEN 1 #define FIREDOOR_OPEN 1
#define IDSCAN 2 #define FIREDOOR_CLOSED 2
#define BOLTS 4
#define SHOCK 8
#define SAFE 16
#define AI_CAMERA_LUMINOSITY 6 #define AI_CAMERA_LUMINOSITY 6
@@ -47,8 +43,8 @@ var/list/restricted_camera_networks = list("thunder","ERT","NUKE","Secret")
#define NETWORK_MINE "MINE" #define NETWORK_MINE "MINE"
#define NETWORK_RESEARCH "Research" #define NETWORK_RESEARCH "Research"
#define NETWORK_RESEARCH_OUTPOST "Research Outpost" #define NETWORK_RESEARCH_OUTPOST "Research Outpost"
#define NETWORK_PRISON "Prison"
#define NETWORK_ROBOTS "Robots" #define NETWORK_ROBOTS "Robots"
#define NETWORK_PRISON "Prison"
#define NETWORK_SECURITY "Security" #define NETWORK_SECURITY "Security"
#define NETWORK_TELECOM "Tcomsat" #define NETWORK_TELECOM "Tcomsat"
#define NETWORK_THUNDER "thunder" #define NETWORK_THUNDER "thunder"
@@ -63,12 +59,12 @@ var/list/restricted_camera_networks = list("thunder","ERT","NUKE","Secret")
#define STAGE_SUPER 11 #define STAGE_SUPER 11
// computer3 error codes, move lower in the file when it passes dev -Sayu // computer3 error codes, move lower in the file when it passes dev -Sayu
#define PROG_CRASH 1 // Generic crash. #define PROG_CRASH 0x1 // Generic crash.
#define MISSING_PERIPHERAL 2 // Missing hardware. #define MISSING_PERIPHERAL 0x2 // Missing hardware.
#define BUSTED_ASS_COMPUTER 4 // Self-perpetuating error. BAC will continue to crash forever. #define BUSTED_ASS_COMPUTER 0x4 // Self-perpetuating error. BAC will continue to crash forever.
#define MISSING_PROGRAM 8 // Some files try to automatically launch a program. This is that failing. #define MISSING_PROGRAM 0x8 // Some files try to automatically launch a program. This is that failing.
#define FILE_DRM 16 // Some files want to not be copied/moved. This is them complaining that you tried. #define FILE_DRM 0x10 // Some files want to not be copied/moved. This is them complaining that you tried.
#define NETWORK_FAILURE 32 #define NETWORK_FAILURE 0x20
// NanoUI flags // NanoUI flags
#define STATUS_INTERACTIVE 2 // GREEN Visability #define STATUS_INTERACTIVE 2 // GREEN Visability
@@ -97,4 +93,4 @@ var/list/restricted_camera_networks = list("thunder","ERT","NUKE","Secret")
#define ATMOS_DEFAULT_VOLUME_PUMP 200 // Liters. #define ATMOS_DEFAULT_VOLUME_PUMP 200 // Liters.
#define ATMOS_DEFAULT_VOLUME_FILTER 200 // L. #define ATMOS_DEFAULT_VOLUME_FILTER 200 // L.
#define ATMOS_DEFAULT_VOLUME_MIXER 200 // L. #define ATMOS_DEFAULT_VOLUME_MIXER 200 // L.
#define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. #define ATMOS_DEFAULT_VOLUME_PIPE 70 // L.

View File

@@ -12,7 +12,7 @@
#define INVISIBILITY_EYE 61 #define INVISIBILITY_EYE 61
#define SEE_INVISIBLE_LIVING 25 #define SEE_INVISIBLE_LIVING 25
#define SEE_INVISIBLE_OBSERVER_NOLIGHTING 15 #define SEE_INVISIBLE_NOLIGHTING 15
#define SEE_INVISIBLE_LEVEL_ONE 35 #define SEE_INVISIBLE_LEVEL_ONE 35
#define SEE_INVISIBLE_LEVEL_TWO 45 #define SEE_INVISIBLE_LEVEL_TWO 45
#define SEE_INVISIBLE_CULT 60 #define SEE_INVISIBLE_CULT 60
@@ -31,22 +31,22 @@
#define MAX_GEAR_COST 5 // Used in chargen for accessory loadout limit. #define MAX_GEAR_COST 5 // Used in chargen for accessory loadout limit.
// Preference toggles. // Preference toggles.
#define SOUND_ADMINHELP 1 #define SOUND_ADMINHELP 0x1
#define SOUND_MIDI 2 #define SOUND_MIDI 0x2
#define SOUND_AMBIENCE 4 #define SOUND_AMBIENCE 0x4
#define SOUND_LOBBY 8 #define SOUND_LOBBY 0x8
#define CHAT_OOC 16 #define CHAT_OOC 0x10
#define CHAT_DEAD 32 #define CHAT_DEAD 0x20
#define CHAT_GHOSTEARS 64 #define CHAT_GHOSTEARS 0x40
#define CHAT_GHOSTSIGHT 128 #define CHAT_GHOSTSIGHT 0x80
#define CHAT_PRAYER 256 #define CHAT_PRAYER 0x100
#define CHAT_RADIO 512 #define CHAT_RADIO 0x200
#define CHAT_ATTACKLOGS 1024 #define CHAT_ATTACKLOGS 0x400
#define CHAT_DEBUGLOGS 2048 #define CHAT_DEBUGLOGS 0x800
#define CHAT_LOOC 4096 #define CHAT_LOOC 0x1000
#define CHAT_GHOSTRADIO 8192 #define CHAT_GHOSTRADIO 0x2000
#define SHOW_TYPING 16384 #define SHOW_TYPING 0x4000
#define CHAT_NOICONS 32768 #define CHAT_NOICONS 0x8000
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC) #define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC)
@@ -63,15 +63,23 @@
#define LIFE_HUD 10 // STATUS_HUD that only reports dead or alive #define LIFE_HUD 10 // STATUS_HUD that only reports dead or alive
//some colors //some colors
#define COLOR_RED "#FF0000"
#define COLOR_GREEN "#00FF00"
#define COLOR_BLUE "#0000FF"
#define COLOR_CYAN "#00FFFF"
#define COLOR_PINK "#FF00FF"
#define COLOR_YELLOW "#FFFF00"
#define COLOR_ORANGE "#FF9900"
#define COLOR_WHITE "#FFFFFF" #define COLOR_WHITE "#FFFFFF"
#define COLOR_SILVER "#C0C0C0"
#define COLOR_GRAY "#808080"
#define COLOR_BLACK "#000000" #define COLOR_BLACK "#000000"
#define COLOR_RED "#FF0000"
#define COLOR_MAROON "#800000"
#define COLOR_YELLOW "#FFFF00"
#define COLOR_OLIVE "#808000"
#define COLOR_LIME "#00FF00"
#define COLOR_GREEN "#008000"
#define COLOR_CYAN "#00FFFF"
#define COLOR_TEAL "#008080"
#define COLOR_BLUE "#0000FF"
#define COLOR_NAVY "#000080"
#define COLOR_PINK "#FF00FF"
#define COLOR_PURPLE "#800080"
#define COLOR_ORANGE "#FF9900"
// Shuttles. // Shuttles.
@@ -117,8 +125,9 @@
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 #define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed #define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
#define LIGHTING_LAYER 11 #define LIGHTING_LAYER 11
#define OBFUSCATION_LAYER 14 //Where images covering the view for eyes are put #define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
#define SCREEN_LAYER 17 //Mob HUD/effects layer #define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
#define SCREEN_LAYER 22 //Mob HUD/effects layer
// Convoluted setup so defines can be supplied by Bay12 main server compile script. // Convoluted setup so defines can be supplied by Bay12 main server compile script.
// Should still work fine for people jamming the icons into their repo. // Should still work fine for people jamming the icons into their repo.
@@ -144,9 +153,9 @@
#define SHARD_SPLINTER "splinters" #define SHARD_SPLINTER "splinters"
#define SHARD_NONE "" #define SHARD_NONE ""
#define MATERIAL_UNMELTABLE 1 #define MATERIAL_UNMELTABLE 0x1
#define MATERIAL_BRITTLE 2 #define MATERIAL_BRITTLE 0x2
#define MATERIAL_PADDING 4 #define MATERIAL_PADDING 0x4
#define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass) #define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass)
@@ -154,3 +163,7 @@
#define BOMBCAP_HEAVY_RADIUS (max_explosion_range/2) #define BOMBCAP_HEAVY_RADIUS (max_explosion_range/2)
#define BOMBCAP_LIGHT_RADIUS max_explosion_range #define BOMBCAP_LIGHT_RADIUS max_explosion_range
#define BOMBCAP_FLASH_RADIUS (max_explosion_range*1.5) #define BOMBCAP_FLASH_RADIUS (max_explosion_range*1.5)
// Special return values from bullet_act(). Positive return values are already used to indicate the blocked level of the projectile.
#define PROJECTILE_CONTINUE -1 //if the projectile should continue flying after calling bullet_act()
#define PROJECTILE_FORCE_MISS -2 //if the projectile should treat the attack as a miss (suppresses attack and admin logs) - only applies to mobs.

View File

@@ -4,16 +4,16 @@
#define DEAD 2 #define DEAD 2
// Bitflags defining which status effects could be or are inflicted on a mob. // Bitflags defining which status effects could be or are inflicted on a mob.
#define CANSTUN 1 #define CANSTUN 0x1
#define CANWEAKEN 2 #define CANWEAKEN 0x2
#define CANPARALYSE 4 #define CANPARALYSE 0x4
#define CANPUSH 8 #define CANPUSH 0x8
#define LEAPING 16 #define LEAPING 0x10
#define PASSEMOTES 32 // Mob has a cortical borer or holders inside of it that need to see emotes. #define PASSEMOTES 0x32 // Mob has a cortical borer or holders inside of it that need to see emotes.
#define GODMODE 4096 #define GODMODE 0x1000
#define FAKEDEATH 8192 // Replaces stuff like changeling.changeling_fakedeath. #define FAKEDEATH 0x2000 // Replaces stuff like changeling.changeling_fakedeath.
#define DISFIGURED 16384 // I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system. #define DISFIGURED 0x4000 // Set but never checked. Remove this sometime and replace occurences with the appropriate organ code
#define XENO_HOST 32768 // Tracks whether we're gonna be a baby alien's mummy. #define XENO_HOST 0x8000 // Tracks whether we're gonna be a baby alien's mummy.
// Grab levels. // Grab levels.
#define GRAB_PASSIVE 1 #define GRAB_PASSIVE 1
@@ -22,9 +22,9 @@
#define GRAB_UPGRADING 4 #define GRAB_UPGRADING 4
#define GRAB_KILL 5 #define GRAB_KILL 5
#define BORGMESON 1 #define BORGMESON 0x1
#define BORGTHERM 2 #define BORGTHERM 0x2
#define BORGXRAY 4 #define BORGXRAY 0x4
#define HOSTILE_STANCE_IDLE 1 #define HOSTILE_STANCE_IDLE 1
#define HOSTILE_STANCE_ALERT 2 #define HOSTILE_STANCE_ALERT 2
@@ -49,7 +49,7 @@
#define I_HELP "help" #define I_HELP "help"
#define I_DISARM "disarm" #define I_DISARM "disarm"
#define I_GRAB "grab" #define I_GRAB "grab"
#define I_HURT "hurt" #define I_HURT "harm"
//These are used Bump() code for living mobs, in the mob_bump_flag, mob_swap_flags, and mob_push_flags vars to determine whom can bump/swap with whom. //These are used Bump() code for living mobs, in the mob_bump_flag, mob_swap_flags, and mob_push_flags vars to determine whom can bump/swap with whom.
#define HUMAN 1 #define HUMAN 1
@@ -58,9 +58,8 @@
#define ROBOT 8 #define ROBOT 8
#define SLIME 16 #define SLIME 16
#define SIMPLE_ANIMAL 32 #define SIMPLE_ANIMAL 32
#define ALLMOBS (HUMAN|MONKEY|ALIEN|ROBOT|SLIME|SIMPLE_ANIMAL) #define HEAVY 64
#define ALLMOBS (HUMAN|MONKEY|ALIEN|ROBOT|SLIME|SIMPLE_ANIMAL|HEAVY)
#define NEXT_MOVE_DELAY 8
// Robot AI notifications // Robot AI notifications
#define ROBOT_NOTIFICATION_NEW_UNIT 1 #define ROBOT_NOTIFICATION_NEW_UNIT 1
@@ -69,18 +68,42 @@
#define ROBOT_NOTIFICATION_MODULE_RESET 4 #define ROBOT_NOTIFICATION_MODULE_RESET 4
// Appearance change flags // Appearance change flags
#define APPEARANCE_UPDATE_DNA 1 #define APPEARANCE_UPDATE_DNA 0x1
#define APPEARANCE_RACE (2|APPEARANCE_UPDATE_DNA) #define APPEARANCE_RACE (0x2|APPEARANCE_UPDATE_DNA)
#define APPEARANCE_GENDER (4|APPEARANCE_UPDATE_DNA) #define APPEARANCE_GENDER (0x4|APPEARANCE_UPDATE_DNA)
#define APPEARANCE_SKIN 8 #define APPEARANCE_SKIN 0x8
#define APPEARANCE_HAIR 16 #define APPEARANCE_HAIR 0x10
#define APPEARANCE_HAIR_COLOR 32 #define APPEARANCE_HAIR_COLOR 0x20
#define APPEARANCE_FACIAL_HAIR 64 #define APPEARANCE_FACIAL_HAIR 0x40
#define APPEARANCE_FACIAL_HAIR_COLOR 128 #define APPEARANCE_FACIAL_HAIR_COLOR 0x80
#define APPEARANCE_EYE_COLOR 256 #define APPEARANCE_EYE_COLOR 0x100
#define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR) #define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR)
#define APPEARANCE_ALL 511 #define APPEARANCE_ALL 0xFFFF
// Click cooldown
#define DEFAULT_ATTACK_COOLDOWN 8 //Default timeout for aggressive actions
#define MIN_SUPPLIED_LAW_NUMBER 15 #define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50 #define MAX_SUPPLIED_LAW_NUMBER 50
//default item on-mob icons
#define INV_HEAD_DEF_ICON 'icons/mob/head.dmi'
#define INV_BACK_DEF_ICON 'icons/mob/back.dmi'
#define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi'
#define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi'
#define INV_W_UNIFORM_DEF_ICON 'icons/mob/uniform.dmi'
#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi'
#define INV_SUIT_DEF_ICON 'icons/mob/ties.dmi'
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
#define MAX_SUPPLIED_LAW_NUMBER 50
// NT's alignment towards the character
#define COMPANY_LOYAL "Loyal"
#define COMPANY_SUPPORTATIVE "Supportive"
#define COMPANY_NEUTRAL "Neutral"
#define COMPANY_SKEPTICAL "Skeptical"
#define COMPANY_OPPOSED "Opposed"
#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED)

View File

@@ -1,7 +1,7 @@
#define SHEET_MATERIAL_AMOUNT 2000 #define SHEET_MATERIAL_AMOUNT 2000
#define TECH_MATERIAL "materials" #define TECH_MATERIAL "materials"
#define TECH_ENGINERING "engineering" #define TECH_ENGINEERING "engineering"
#define TECH_PHORON "phorontech" #define TECH_PHORON "phorontech"
#define TECH_POWER "powerstorage" #define TECH_POWER "powerstorage"
#define TECH_BLUESPACE "bluespace" #define TECH_BLUESPACE "bluespace"
@@ -12,7 +12,7 @@
#define TECH_ILLEGAL "syndicate" #define TECH_ILLEGAL "syndicate"
#define TECH_ARCANE "arcane" #define TECH_ARCANE "arcane"
#define IMPRINTER 1 //For circuits. Uses glass/chemicals. #define IMPRINTER 0x1 //For circuits. Uses glass/chemicals.
#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals #define PROTOLATHE 0x2 //New stuff. Uses glass/metal/chemicals
#define MECHFAB 4 //Remember, objects utilising this flag should have construction_time and construction_cost vars. #define MECHFAB 0x4 //Mechfab
#define CHASSIS 8 //For protolathe, but differently #define CHASSIS 0x8 //For protolathe, but differently

View File

@@ -1,31 +1,27 @@
// Species flags. // Species flags.
#define NO_BLOOD 1 // Vessel var is not filled with blood, cannot bleed out. #define NO_BLOOD 0x1 // Vessel var is not filled with blood, cannot bleed out.
#define NO_BREATHE 2 // Cannot suffocate or take oxygen loss. #define NO_BREATHE 0x2 // Cannot suffocate or take oxygen loss.
#define NO_SCAN 4 // Cannot be scanned in a DNA machine/genome-stolen. #define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen.
#define NO_PAIN 8 // Cannot suffer halloss/recieves deceptive health indicator. #define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator.
#define NO_SLIP 16 // Cannot fall over. #define NO_SLIP 0x10 // Cannot fall over.
#define NO_POISON 32 // Cannot not suffer toxloss. #define NO_POISON 0x20 // Cannot not suffer toxloss.
#define HAS_SKIN_TONE 64 // Skin tone selectable in chargen. (0-255) #define IS_PLANT 0x40 // Is a treeperson.
#define HAS_SKIN_COLOR 128 // Skin colour selectable in chargen. (RGB) #define NO_MINOR_CUT 0x80 // Can step on broken glass with no ill-effects. Either thick skin (diona/vox), cut resistant (slimes) or incorporeal (shadows)
#define HAS_LIPS 256 // Lips are drawn onto the mob icon. (lipstick) // unused: 0x8000 - higher than this will overflow
#define HAS_UNDERWEAR 512 // Underwear is drawn onto the mob icon.
#define IS_PLANT 1024 // Is a treeperson. // Species spawn flags
#define IS_WHITELISTED 2048 // Must be whitelisted to play. #define IS_WHITELISTED 0x1 // Must be whitelisted to play.
#define HAS_EYE_COLOR 4096 // Eye colour selectable in chargen. (RGB) #define CAN_JOIN 0x2 // Species is selectable in chargen.
#define CAN_JOIN 8192 // Species is selectable in chargen. #define IS_RESTRICTED 0x4 // Is not a core/normally playable species. (castes, mutantraces)
#define IS_RESTRICTED 16384 // Is not a core/normally playable species. (castes, mutantraces)
// unused: 32768 - higher than this will overflow // Species appearance flags
#define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255)
#define HAS_SKIN_COLOR 0x2 // Skin colour selectable in chargen. (RGB)
#define HAS_LIPS 0x4 // Lips are drawn onto the mob icon. (lipstick)
#define HAS_UNDERWEAR 0x8 // Underwear is drawn onto the mob icon.
#define HAS_EYE_COLOR 0x10 // Eye colour selectable in chargen. (RGB)
// Languages. // Languages.
#define LANGUAGE_HUMAN 1
#define LANGUAGE_ALIEN 2
#define LANGUAGE_DOG 4
#define LANGUAGE_CAT 8
#define LANGUAGE_BINARY 16
#define LANGUAGE_OTHER 32768
#define LANGUAGE_UNIVERSAL 65535
#define LANGUAGE_SOL_COMMON "Sol Common" #define LANGUAGE_SOL_COMMON "Sol Common"
#define LANGUAGE_UNATHI "Sinta'unathi" #define LANGUAGE_UNATHI "Sinta'unathi"
#define LANGUAGE_SIIK_MAAS "Siik'maas" #define LANGUAGE_SIIK_MAAS "Siik'maas"
@@ -36,12 +32,14 @@
#define LANGUAGE_GUTTER "Gutter" #define LANGUAGE_GUTTER "Gutter"
// Language flags. // Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted. #define WHITELISTED 1 // Language is available if the speaker is whitelisted.
#define RESTRICTED 2 // Language can only be accquired by spawning or an admin. #define RESTRICTED 2 // Language can only be acquired by spawning or an admin.
#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight. #define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight.
#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand. #define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand.
#define HIVEMIND 16 // Broadcast to all mobs with this language. #define HIVEMIND 16 // Broadcast to all mobs with this language.
#define NONGLOBAL 32 // Do not add to general languages list. #define NONGLOBAL 32 // Do not add to general languages list.
#define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes) #define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes)
#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message #define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems #define NO_STUTTER 256 // No stuttering, slurring, or other speech problems
#define COMMON_VERBS 512 // Robots will apply regular verbs to this

10
code/__defines/turfs.dm Normal file
View File

@@ -0,0 +1,10 @@
#define TURF_REMOVE_CROWBAR 1
#define TURF_REMOVE_SCREWDRIVER 2
#define TURF_REMOVE_SHOVEL 4
#define TURF_REMOVE_WRENCH 8
#define TURF_CAN_BREAK 16
#define TURF_CAN_BURN 32
#define TURF_HAS_EDGES 64
#define TURF_HAS_CORNERS 128
#define TURF_IS_FRAGILE 256
#define TURF_ACID_IMMUNE 512

View File

@@ -0,0 +1,47 @@
/obj/proc/analyze_gases(var/obj/A, var/mob/user)
if(src != A)
user.visible_message("<span class='notice'>\The [user] has used \an [src] on \the [A]</span>")
A.add_fingerprint(user)
var/list/result = A.atmosanalyze(user)
if(result && result.len)
user << "<span class='notice'>Results of the analysis[src == A ? "" : " of \the [A]"]</span>"
for(var/line in result)
user << "<span class='notice'>[line]</span>"
return 1
user << "<span class='warning'>Your [src] flashes a red light as it fails to analyze \the [A].</span>"
return 0
/proc/atmosanalyzer_scan(var/obj/target, var/datum/gas_mixture/mixture, var/mob/user)
var/pressure = mixture.return_pressure()
var/total_moles = mixture.total_moles
var/list/results = list()
if (total_moles>0)
results += "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/mix in mixture.gas)
results += "<span class='notice'>[gas_data.name[mix]]: [round((mixture.gas[mix] / total_moles) * 100)]%</span>"
results += "<span class='notice'>Temperature: [round(mixture.temperature-T0C)]&deg;C</span>"
else
results += "<span class='notice'>\The [target] is empty!</span>"
return results
/obj/proc/atmosanalyze(var/mob/user)
return
/obj/item/weapon/tank/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.air_contents, user)
/obj/machinery/portable_atmospherics/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.air_contents, user)
/obj/machinery/atmospherics/pipe/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.parent.air, user)
/obj/machinery/power/rad_collector/atmosanalyze(var/mob/user)
if(P) return atmosanalyzer_scan(src, src.P.air_contents, user)
/obj/item/weapon/flamethrower/atmosanalyze(var/mob/user)
if(ptank) return atmosanalyzer_scan(src, ptank.air_contents, user)

View File

@@ -64,6 +64,8 @@ var/global/list/rune_list = new()
var/global/list/escape_list = list() var/global/list/escape_list = list()
var/global/list/endgame_exits = list() var/global/list/endgame_exits = list()
var/global/list/endgame_safespawns = list() var/global/list/endgame_safespawns = list()
var/global/list/syndicate_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
////////////////////////// //////////////////////////
/////Initial Building///// /////Initial Building/////
////////////////////////// //////////////////////////
@@ -130,9 +132,9 @@ var/global/list/endgame_safespawns = list()
S.race_key = rkey //Used in mob icon caching. S.race_key = rkey //Used in mob icon caching.
all_species[S.name] = S all_species[S.name] = S
if(!(S.flags & IS_RESTRICTED)) if(!(S.spawn_flags & IS_RESTRICTED))
playable_species += S.name playable_species += S.name
if(S.flags & IS_WHITELISTED) if(S.spawn_flags & IS_WHITELISTED)
whitelisted_species += S.name whitelisted_species += S.name
//Posters //Posters

View File

@@ -635,7 +635,7 @@ The _flatIcons list is a cache for generated icon files.
*/ */
proc // Creates a single icon from a given /atom or /image. Only the first argument is required. proc // Creates a single icon from a given /atom or /image. Only the first argument is required.
getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT) getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT, always_use_defdir = 0)
// We start with a blank canvas, otherwise some icon procs crash silently // We start with a blank canvas, otherwise some icon procs crash silently
var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon
if(!A) if(!A)
@@ -666,7 +666,7 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu
noIcon = TRUE // Do not render this object. noIcon = TRUE // Do not render this object.
var/curdir var/curdir
if(A.dir != 2) if(A.dir != 2 && !always_use_defdir)
curdir = A.dir curdir = A.dir
else else
curdir = defdir curdir = defdir

View File

@@ -592,7 +592,7 @@ proc/dd_sortedTextList(list/incoming)
return dd_sortedtextlist(incoming, case_sensitive) return dd_sortedtextlist(incoming, case_sensitive)
datum/proc/dd_SortValue() /datum/proc/dd_SortValue()
return "[src]" return "[src]"
/obj/machinery/dd_SortValue() /obj/machinery/dd_SortValue()
@@ -604,10 +604,13 @@ datum/proc/dd_SortValue()
/datum/alarm/dd_SortValue() /datum/alarm/dd_SortValue()
return "[sanitize_old(last_name)]" return "[sanitize_old(last_name)]"
/proc/subtypes(prototype)
return (typesof(prototype) - prototype)
//creates every subtype of prototype (excluding prototype) and adds it to list L. //creates every subtype of prototype (excluding prototype) and adds it to list L.
//if no list/L is provided, one is created. //if no list/L is provided, one is created.
/proc/init_subtypes(prototype, list/L) /proc/init_subtypes(prototype, list/L)
if(!istype(L)) L = list() if(!istype(L)) L = list()
for(var/path in (typesof(prototype) - prototype)) for(var/path in subtypes(prototype))
L += new path() L += new path()
return L return L

View File

@@ -109,6 +109,12 @@
M = whom M = whom
C = M.client C = M.client
key = M.key key = M.key
else if(istype(whom, /datum/mind))
var/datum/mind/D = whom
key = D.key
M = D.current
if(D.current)
C = D.current.client
else if(istype(whom, /datum)) else if(istype(whom, /datum))
var/datum/D = whom var/datum/D = whom
return "*invalid:[D.type]*" return "*invalid:[D.type]*"

View File

@@ -20,7 +20,7 @@ var/command_name = null
if (command_name) if (command_name)
return command_name return command_name
var/name = "Central Command" var/name = "[boss_name]"
command_name = name command_name = name
return name return name

View File

@@ -55,7 +55,7 @@
//If you have a problem with sanitize() in chat, when quotes and >, < are displayed as html entites - //If you have a problem with sanitize() in chat, when quotes and >, < are displayed as html entites -
//this is a problem of double-encode(when & becomes &amp;), use sanitize() with encode=0, but not the sanitizeSafe()! //this is a problem of double-encode(when & becomes &amp;), use sanitize() with encode=0, but not the sanitizeSafe()!
/proc/sanitizeSafe(var/input, var/max_length = MAX_MESSAGE_LEN, var/encode = 1, var/trim = 1, var/extra = 1) /proc/sanitizeSafe(var/input, var/max_length = MAX_MESSAGE_LEN, var/encode = 1, var/trim = 1, var/extra = 1)
return sanitize(replace_characters(input, list(">"=" ","<"=" ", "\""="'"), max_length, encode, trim, extra)) return sanitize(replace_characters(input, list(">"=" ","<"=" ", "\""="'")), max_length, encode, trim, extra)
//Filters out undesirable characters from names //Filters out undesirable characters from names
/proc/sanitizeName(var/input, var/max_length = MAX_NAME_LEN, var/allow_numbers = 0) /proc/sanitizeName(var/input, var/max_length = MAX_NAME_LEN, var/allow_numbers = 0)
@@ -116,7 +116,7 @@
if(last_char_group == 1) if(last_char_group == 1)
output = copytext(output,1,length(output)) //removes the last character (in this case a space) output = copytext(output,1,length(output)) //removes the last character (in this case a space)
for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai")) //prevents these common metagamey names for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai","plating")) //prevents these common metagamey names
if(cmptext(output,bad_name)) return //(not case sensitive) if(cmptext(output,bad_name)) return //(not case sensitive)
return output return output

View File

@@ -6,13 +6,13 @@
var/roundstart_hour = 0 var/roundstart_hour = 0
//Returns the world time in english //Returns the world time in english
proc/worldtime2text(time = world.time) proc/worldtime2text(time = world.time, timeshift = 1)
if(!roundstart_hour) roundstart_hour = pick(2,7,12,17) if(!roundstart_hour) roundstart_hour = pick(2,7,12,17)
return "[(round(time / 36000)+roundstart_hour) % 24]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" return timeshift ? time2text(time+(36000*roundstart_hour), "hh:mm") : time2text(time, "hh:mm")
proc/worlddate2text() proc/worlddate2text()
return num2text((text2num(time2text(world.timeofday, "YYYY"))+544)) + "-" + time2text(world.timeofday, "MM-DD") return num2text((text2num(time2text(world.timeofday, "YYYY"))+544)) + "-" + time2text(world.timeofday, "MM-DD")
proc/time_stamp() proc/time_stamp()
return time2text(world.timeofday, "hh:mm:ss") return time2text(world.timeofday, "hh:mm:ss")
@@ -27,3 +27,21 @@ proc/isDay(var/month, var/day)
// Uncomment this out when debugging! // Uncomment this out when debugging!
//else //else
//return 1 //return 1
var/next_duration_update = 0
var/last_round_duration = 0
proc/round_duration()
if(last_round_duration && world.time < next_duration_update)
return last_round_duration
var/mills = world.time // 1/10 of a second, not real milliseconds but whatever
//var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something
var/mins = round((mills % 36000) / 600)
var/hours = round(mills / 36000)
mins = mins < 10 ? add_zero(mins, 1) : mins
hours = hours < 10 ? add_zero(hours, 1) : hours
last_round_duration = "[hours]:[mins]"
next_duration_update = world.time + 1 MINUTES
return last_round_duration

View File

@@ -38,7 +38,7 @@
// Returns the hex value of a number given a value assumed to be a base-ten value // Returns the hex value of a number given a value assumed to be a base-ten value
/proc/num2hex(num, padlength) /proc/num2hex(num, padlength)
var/global/list/hexdigits = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F") var/global/list/hexdigits = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
. = "" . = ""
while(num > 0) while(num > 0)
var/hexdigit = hexdigits[(num & 0xF) + 1] var/hexdigit = hexdigits[(num & 0xF) + 1]
@@ -46,7 +46,7 @@
num >>= 4 //go to the next half-byte num >>= 4 //go to the next half-byte
//pad with zeroes //pad with zeroes
var/left = padlength - length(.) var/left = padlength - length(.)
while (left-- > 0) while (left-- > 0)
. = "0[.]" . = "0[.]"
@@ -275,13 +275,6 @@ proc/tg_list2text(list/list, glue=",")
if (rights & R_MENTOR) . += "[seperator]+MENTOR" if (rights & R_MENTOR) . += "[seperator]+MENTOR"
return . return .
/proc/ui_style2icon(ui_style)
switch (ui_style)
if ("old") return 'icons/mob/screen1_old.dmi'
if ("Orange") return 'icons/mob/screen1_Orange.dmi'
if ("Midnight") return 'icons/mob/screen1_Midnight.dmi'
else return 'icons/mob/screen1_White.dmi'
// heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ // heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/
/proc/heat2color(temp) /proc/heat2color(temp)
return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp)) return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp))

View File

@@ -4,6 +4,9 @@
* A large number of misc global procs. * A large number of misc global procs.
*/ */
//Checks if all high bits in req_mask are set in bitfield
#define BIT_TEST_ALL(bitfield, req_mask) ((~(bitfield) & (req_mask)) == 0)
//Inverts the colour of an HTML string //Inverts the colour of an HTML string
/proc/invertHTML(HTMLstring) /proc/invertHTML(HTMLstring)
@@ -562,10 +565,13 @@ proc/GaussRandRound(var/sigma,var/roundto)
return toReturn return toReturn
//Step-towards method of determining whether one atom can see another. Similar to viewers() //Step-towards method of determining whether one atom can see another. Similar to viewers()
/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. /proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldn't be arsed to do actual raycasting :I This is horribly inaccurate.
var/turf/current = get_turf(source) var/turf/current = get_turf(source)
var/turf/target_turf = get_turf(target) var/turf/target_turf = get_turf(target)
var/steps = 0 var/steps = 0
if(!current || !target_turf)
return 0
while(current != target_turf) while(current != target_turf)
if(steps > length) return 0 if(steps > length) return 0
@@ -774,11 +780,15 @@ proc/GaussRandRound(var/sigma,var/roundto)
var/old_dir1 = T.dir var/old_dir1 = T.dir
var/old_icon_state1 = T.icon_state var/old_icon_state1 = T.icon_state
var/old_icon1 = T.icon var/old_icon1 = T.icon
var/old_overlays = T.overlays.Copy()
var/old_underlays = T.underlays.Copy()
var/turf/X = B.ChangeTurf(T.type) var/turf/X = B.ChangeTurf(T.type)
X.set_dir(old_dir1) X.set_dir(old_dir1)
X.icon_state = old_icon_state1 X.icon_state = old_icon_state1
X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
X.overlays = old_overlays
X.underlays = old_underlays
var/turf/simulated/ST = T var/turf/simulated/ST = T
if(istype(ST) && ST.zone) if(istype(ST) && ST.zone)
@@ -824,7 +834,7 @@ proc/GaussRandRound(var/sigma,var/roundto)
if(!istype(O,/obj)) continue if(!istype(O,/obj)) continue
O.loc = X O.loc = X
for(var/mob/M in T) for(var/mob/M in T)
if(!istype(M,/mob) || istype(M, /mob/aiEye)) continue // If we need to check for more mobs, I'll add a variable if(!istype(M,/mob) || istype(M, /mob/eye)) continue // If we need to check for more mobs, I'll add a variable
M.loc = X M.loc = X
// var/area/AR = X.loc // var/area/AR = X.loc
@@ -871,6 +881,8 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
// Movement based on lower left corner. Tiles that do not fit // Movement based on lower left corner. Tiles that do not fit
// into the new area will not be moved. // into the new area will not be moved.
// Does *not* affect gases etc; copied turfs will be changed via ChangeTurf, and the dir, icon, and icon_state copied. All other vars will remain default.
if(!A || !src) return 0 if(!A || !src) return 0
var/list/turfs_src = get_area_turfs(src.type) var/list/turfs_src = get_area_turfs(src.type)
@@ -919,16 +931,20 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
var/old_dir1 = T.dir var/old_dir1 = T.dir
var/old_icon_state1 = T.icon_state var/old_icon_state1 = T.icon_state
var/old_icon1 = T.icon var/old_icon1 = T.icon
var/old_overlays = T.overlays.Copy()
var/old_underlays = T.underlays.Copy()
if(platingRequired) if(platingRequired)
if(istype(B, get_base_turf(B.z))) if(istype(B, get_base_turf(B.z)))
continue moving continue moving
var/turf/X = new T.type(B) var/turf/X = B
X.ChangeTurf(T.type)
X.set_dir(old_dir1) X.set_dir(old_dir1)
X.icon_state = old_icon_state1 X.icon_state = old_icon_state1
X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
X.overlays = old_overlays
X.underlays = old_underlays
var/list/objs = new/list() var/list/objs = new/list()
var/list/newobjs = new/list() var/list/newobjs = new/list()
@@ -952,7 +968,7 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
for(var/mob/M in T) for(var/mob/M in T)
if(!istype(M,/mob) || istype(M, /mob/aiEye)) continue // If we need to check for more mobs, I'll add a variable if(!istype(M,/mob) || istype(M, /mob/eye)) continue // If we need to check for more mobs, I'll add a variable
mobs += M mobs += M
for(var/mob/M in mobs) for(var/mob/M in mobs)
@@ -964,12 +980,6 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
copiedobjs += newobjs copiedobjs += newobjs
copiedobjs += newmobs copiedobjs += newmobs
for(var/V in T.vars)
if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity")))
X.vars[V] = T.vars[V]
// var/area/AR = X.loc // var/area/AR = X.loc
// if(AR.lighting_use_dynamic) // if(AR.lighting_use_dynamic)
@@ -985,22 +995,9 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
var/list/doors = new/list()
if(toupdate.len) if(toupdate.len)
for(var/turf/simulated/T1 in toupdate) for(var/turf/simulated/T1 in toupdate)
for(var/obj/machinery/door/D2 in T1) air_master.mark_for_update(T1)
doors += D2
/*if(T1.parent)
air_master.groups_to_rebuild += T1.parent
else
air_master.tiles_to_update += T1*/
for(var/obj/O in doors)
O:update_nearby_tiles(1)
return copiedobjs return copiedobjs
@@ -1056,12 +1053,10 @@ proc/get_mob_with_client_list()
//gets the turf the atom is located in (or itself, if it is a turf). //gets the turf the atom is located in (or itself, if it is a turf).
//returns null if the atom is not in a turf. //returns null if the atom is not in a turf.
/proc/get_turf(atom/location) /proc/get_turf(atom/A)
while(location) if(!istype(A)) return
if(isturf(location)) for(A, A && !isturf(A), A=A.loc);
return location return A
location = location.loc
return null
/proc/get(atom/loc, type) /proc/get(atom/loc, type)
while(loc) while(loc)
@@ -1289,29 +1284,39 @@ var/list/WALLITEMS = list(
colour += temp_col colour += temp_col
return colour return colour
var/mob/dview/dview_mob = new
//Version of view() which ignores darkness, because BYOND doesn't have it. //Version of view() which ignores darkness, because BYOND doesn't have it.
/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) /proc/dview(var/range = world.view, var/center, var/invis_flags = 0)
if(!center) if(!center)
return return
var/global/mob/dview/DV dview_mob.loc = center
if(!DV)
DV = new
DV.loc = center dview_mob.see_invisible = invis_flags
DV.see_in_dark = range . = view(range, dview_mob)
DV.see_invisible = invis_flags dview_mob.loc = null
. = view(range, DV)
DV.loc = null
/mob/dview /mob/dview
invisibility = 101 invisibility = 101
density = 0 density = 0
anchored = 1
simulated = 0
see_in_dark = 1e6
/atom/proc/get_light_and_color(var/atom/origin) /atom/proc/get_light_and_color(var/atom/origin)
if(origin) if(origin)
color = origin.color color = origin.color
set_light(origin.light_range, origin.light_power, origin.light_color) set_light(origin.light_range, origin.light_power, origin.light_color)
/mob/dview/New()
..()
// We don't want to be in any mob lists; we're a dummy not a mob.
mob_list -= src
if(stat == DEAD)
dead_mob_list -= src
else
living_mob_list -= src

View File

@@ -15,7 +15,6 @@
return return
if(control_disabled || stat) return if(control_disabled || stat) return
next_move = world.time + 9
if(ismob(A)) if(ismob(A))
ai_actual_track(A) ai_actual_track(A)
@@ -32,7 +31,7 @@
build_click(src, client.buildmode, params, A) build_click(src, client.buildmode, params, A)
return return
if(control_disabled || stat) if(stat)
return return
var/list/modifiers = params2list(params) var/list/modifiers = params2list(params)
@@ -52,9 +51,8 @@
CtrlClickOn(A) CtrlClickOn(A)
return return
if(world.time <= next_move) if(control_disabled || !canClick())
return return
next_move = world.time + 9
if(aiCamera.in_camera_mode) if(aiCamera.in_camera_mode)
aiCamera.camera_mode_off() aiCamera.camera_mode_off()
@@ -91,13 +89,24 @@
*/ */
/mob/living/silicon/ai/ShiftClickOn(var/atom/A) /mob/living/silicon/ai/ShiftClickOn(var/atom/A)
A.AIShiftClick(src) if(!control_disabled && A.AIShiftClick(src))
return
..()
/mob/living/silicon/ai/CtrlClickOn(var/atom/A) /mob/living/silicon/ai/CtrlClickOn(var/atom/A)
A.AICtrlClick(src) if(!control_disabled && A.AICtrlClick(src))
return
..()
/mob/living/silicon/ai/AltClickOn(var/atom/A) /mob/living/silicon/ai/AltClickOn(var/atom/A)
A.AIAltClick(src) if(!control_disabled && A.AIAltClick(src))
return
..()
/mob/living/silicon/ai/MiddleClickOn(var/atom/A) /mob/living/silicon/ai/MiddleClickOn(var/atom/A)
A.AIMiddleClick(src) if(!control_disabled && A.AIMiddleClick(src))
return
..()
/* /*
The following criminally helpful code is just the previous code cleaned up; The following criminally helpful code is just the previous code cleaned up;
@@ -107,11 +116,6 @@
/atom/proc/AICtrlShiftClick() /atom/proc/AICtrlShiftClick()
return return
/obj/machinery/door/airlock/AICtrlShiftClick()
if(emagged)
return
return
/atom/proc/AIShiftClick() /atom/proc/AIShiftClick()
return return
@@ -120,7 +124,7 @@
Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "1"), 1) // 1 meaning no window (consistency!) Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "1"), 1) // 1 meaning no window (consistency!)
else else
Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "0"), 1) Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "0"), 1)
return return 1
/atom/proc/AICtrlClick() /atom/proc/AICtrlClick()
return return
@@ -130,15 +134,18 @@
Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "0"), 1)// 1 meaning no window (consistency!) Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "0"), 1)// 1 meaning no window (consistency!)
else else
Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "1"), 1) Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "1"), 1)
return 1
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
Topic(src, list("src"= "\ref[src]", "breaker"="1"), 1) // 1 meaning no window (consistency!) Topic(src, list("src"= "\ref[src]", "breaker"="1"), 1) // 1 meaning no window (consistency!)
return 1
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets /obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
Topic(src, list("src"= "\ref[src]", "command"="enable", "value"="[!enabled]"), 1) // 1 meaning no window (consistency!) Topic(src, list("src"= "\ref[src]", "command"="enable", "value"="[!enabled]"), 1) // 1 meaning no window (consistency!)
return 1
/atom/proc/AIAltClick(var/atom/A) /atom/proc/AIAltClick(var/atom/A)
AltClick(A) return AltClick(A)
/obj/machinery/door/airlock/AIAltClick() // Electrifies doors. /obj/machinery/door/airlock/AIAltClick() // Electrifies doors.
if(!electrified_until) if(!electrified_until)
@@ -147,20 +154,25 @@
else else
// disable/6 is not in Topic; disable/5 disables both temporary and permanent shock // disable/6 is not in Topic; disable/5 disables both temporary and permanent shock
Topic(src, list("src"= "\ref[src]", "command"="electrify_permanently", "activate" = "0"), 1) Topic(src, list("src"= "\ref[src]", "command"="electrify_permanently", "activate" = "0"), 1)
return return 1
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets /obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
Topic(src, list("src"= "\ref[src]", "command"="lethal", "value"="[!lethal]"), 1) // 1 meaning no window (consistency!) Topic(src, list("src"= "\ref[src]", "command"="lethal", "value"="[!lethal]"), 1) // 1 meaning no window (consistency!)
return 1
/atom/proc/AIMiddleClick() /atom/proc/AIMiddleClick(var/mob/living/silicon/user)
return return 0
/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. /obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights.
if(..())
return
if(!src.lights) if(!src.lights)
Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "1"), 1) // 1 meaning no window (consistency!) Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "1"), 1) // 1 meaning no window (consistency!)
else else
Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "0"), 1) Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "0"), 1)
return return 1
// //
// Override AdjacentQuick for AltClicking // Override AdjacentQuick for AltClicking

View File

@@ -4,7 +4,7 @@
*/ */
// 1 decisecond click delay (above and beyond mob/next_move) // 1 decisecond click delay (above and beyond mob/next_move)
/mob/var/next_click = 0 /mob/var/next_click = 0
/* /*
Before anything else, defer these calls to a per-mobtype handler. This allows us to Before anything else, defer these calls to a per-mobtype handler. This allows us to
@@ -15,12 +15,14 @@
Note that this proc can be overridden, and is in the case of screen objects. Note that this proc can be overridden, and is in the case of screen objects.
*/ */
/atom/Click(location,control,params)
/atom/Click(var/location, var/control, var/params) // This is their reaction to being clicked on (standard proc)
if(src) if(src)
usr.ClickOn(src, params) usr.ClickOn(src, params)
/atom/DblClick(location,control,params)
/atom/DblClick(var/location, var/control, var/params)
if(src) if(src)
usr.DblClickOn(src,params) usr.DblClickOn(src, params)
/* /*
Standard mob ClickOn() Standard mob ClickOn()
@@ -35,8 +37,8 @@
* item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
*/ */
/mob/proc/ClickOn( var/atom/A, var/params ) /mob/proc/ClickOn(var/atom/A, var/params)
if(world.time <= next_click) if(world.time <= next_click) // Hard check, before anything else, to avoid crashing
return return
next_click = world.time + 1 next_click = world.time + 1
@@ -66,16 +68,17 @@
face_atom(A) // change direction to face what you clicked on face_atom(A) // change direction to face what you clicked on
if(next_move > world.time) // in the year 2000... if(!canClick()) // in the year 2000...
return return
if(istype(loc,/obj/mecha)) if(istype(loc, /obj/mecha))
if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled if(!locate(/turf) in list(A, A.loc)) // Prevents inventory from being drilled
return return
var/obj/mecha/M = loc var/obj/mecha/M = loc
return M.click_action(A,src) return M.click_action(A, src)
if(restrained()) if(restrained())
setClickCooldown(10)
RestrainedClickOn(A) RestrainedClickOn(A)
return return
@@ -85,79 +88,76 @@
return return
throw_mode_off() throw_mode_off()
if(!istype(A,/obj/item/weapon/gun) && !isturf(A) && !istype(A,/obj/screen)) if(!istype(A, /obj/item/weapon/gun) && !isturf(A) && !istype(A, /obj/screen))
last_target_click = world.time last_target_click = world.time
var/obj/item/W = get_active_hand() var/obj/item/W = get_active_hand()
if(W == A) if(W == A) // Handle attack_self
next_move = world.time + 6
if(W.flags&USEDELAY)
next_move += 5
W.attack_self(src) W.attack_self(src)
if(hand) if(hand)
update_inv_l_hand(0) update_inv_l_hand(0)
else else
update_inv_r_hand(0) update_inv_r_hand(0)
return return
// operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src) //Atoms on your person
// A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth.
var/sdepth = A.storage_depth(src) var/sdepth = A.storage_depth(src)
if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 1)) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1))
// faster access to objects already on you // faster access to objects already on you
if(A in contents) if(A.loc != src)
next_move = world.time + 6 // on your person setMoveCooldown(10) //getting something out of a backpack
else
next_move = world.time + 8 // in a box/bag or in your square
// No adjacency needed
if(W) if(W)
if(W.flags&USEDELAY)
next_move += 5
var/resolved = W.resolve_attackby(A, src) var/resolved = W.resolve_attackby(A, src)
if(!resolved && A && W) if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1 indicates adjacency W.afterattack(A, src, 1, params) // 1 indicates adjacency
else else
if(ismob(A)) // No instant mob attacking
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
UnarmedAttack(A, 1) UnarmedAttack(A, 1)
return return
if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that
return return
// Allows you to click on a box's contents, if that box is on the ground, but no deeper than that //Atoms on turfs (not on your person)
// A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
sdepth = A.storage_depth_turf() sdepth = A.storage_depth_turf()
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
next_move = world.time + 10
if(A.Adjacent(src)) // see adjacent.dm if(A.Adjacent(src)) // see adjacent.dm
if(W) setMoveCooldown(5)
if(W.flags&USEDELAY)
next_move += 5
if(W)
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
var/resolved = W.resolve_attackby(A,src) var/resolved = W.resolve_attackby(A,src)
if(!resolved && A && W) if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1: clicking something Adjacent W.afterattack(A, src, 1, params) // 1: clicking something Adjacent
else else
if(ismob(A)) // No instant mob attacking
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
UnarmedAttack(A, 1) UnarmedAttack(A, 1)
return return
else // non-adjacent click else // non-adjacent click
if(W) if(W)
W.afterattack(A,src,0,params) // 0: not Adjacent W.afterattack(A, src, 0, params) // 0: not Adjacent
else else
RangedAttack(A, params) RangedAttack(A, params)
return return
/mob/proc/changeNext_move(num) /mob/proc/setClickCooldown(var/timeout)
next_move = world.time + num next_move = max(world.time + timeout, next_move)
// Default behavior: ignore double clicks, consider them normal clicks instead /mob/proc/canClick()
if(config.no_click_cooldown || next_move <= world.time)
return 1
return 0
// Default behavior: ignore double clicks, the second click that makes the doubleclick call already calls for a normal click
/mob/proc/DblClickOn(var/atom/A, var/params) /mob/proc/DblClickOn(var/atom/A, var/params)
ClickOn(A,params) return
/* /*
Translates into attack_hand, etc. Translates into attack_hand, etc.
@@ -201,14 +201,12 @@
LaserEyes(A) // moved into a proc below LaserEyes(A) // moved into a proc below
else if(TK in mutations) else if(TK in mutations)
switch(get_dist(src,A)) switch(get_dist(src,A))
if(0)
;
if(1 to 5) // not adjacent may mean blocked by window if(1 to 5) // not adjacent may mean blocked by window
next_move += 2 setMoveCooldown(2)
if(5 to 7) if(5 to 7)
next_move += 5 setMoveCooldown(5)
if(8 to tk_maxrange) if(8 to tk_maxrange)
next_move += 10 setMoveCooldown(10)
else else
return return
A.attack_tk(src) A.attack_tk(src)
@@ -226,11 +224,8 @@
Only used for swapping hands Only used for swapping hands
*/ */
/mob/proc/MiddleClickOn(var/atom/A) /mob/proc/MiddleClickOn(var/atom/A)
return
/mob/living/carbon/MiddleClickOn(var/atom/A)
swap_hand() swap_hand()
return
// In case of use break glass // In case of use break glass
/* /*
@@ -281,7 +276,7 @@
else else
user.listed_turf = T user.listed_turf = T
user.client.statpanel = T.name user.client.statpanel = T.name
return return 1
/mob/proc/TurfAdjacent(var/turf/T) /mob/proc/TurfAdjacent(var/turf/T)
return T.AdjacentQuick(src) return T.AdjacentQuick(src)
@@ -307,7 +302,7 @@
return return
/mob/living/LaserEyes(atom/A) /mob/living/LaserEyes(atom/A)
next_move = world.time + 6 setClickCooldown(4)
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
var/turf/U = get_turf(A) var/turf/U = get_turf(A)

View File

@@ -35,7 +35,7 @@
if(stat || lockcharge || weakened || stunned || paralysis) if(stat || lockcharge || weakened || stunned || paralysis)
return return
if(next_move >= world.time) if(!canClick())
return return
face_atom(A) // change direction to face what you clicked on face_atom(A) // change direction to face what you clicked on
@@ -68,9 +68,6 @@
return return
if(W == A) if(W == A)
next_move = world.time + 8
if(W.flags&USEDELAY)
next_move += 5
W.attack_self(src) W.attack_self(src)
return return
@@ -78,9 +75,6 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents)) if(A == loc || (A in loc) || (A in contents))
// No adjacency checks // No adjacency checks
next_move = world.time + 8
if(W.flags&USEDELAY)
next_move += 5
var/resolved = A.attackby(W,src) var/resolved = A.attackby(W,src)
if(!resolved && A && W) if(!resolved && A && W)
@@ -93,16 +87,12 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc)) if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm if(A.Adjacent(src)) // see adjacent.dm
next_move = world.time + 10
if(W.flags&USEDELAY)
next_move += 5
var/resolved = A.attackby(W, src) var/resolved = A.attackby(W, src)
if(!resolved && A && W) if(!resolved && A && W)
W.afterattack(A, src, 1, params) W.afterattack(A, src, 1, params)
return return
else else
next_move = world.time + 10
W.afterattack(A, src, 0, params) W.afterattack(A, src, 0, params)
return return
return return

View File

@@ -141,6 +141,25 @@ datum/hud/New(mob/owner)
instantiate() instantiate()
..() ..()
/datum/hud/Destroy()
..()
grab_intent = null
hurt_intent = null
disarm_intent = null
help_intent = null
lingchemdisplay = null
blobpwrdisplay = null
blobhealthdisplay = null
r_hand_hud_object = null
l_hand_hud_object = null
action_intent = null
move_intent = null
adding = null
other = null
hotkeybuttons = null
// item_action_list = null // ?
mymob = null
/datum/hud/proc/hidden_inventory_update() /datum/hud/proc/hidden_inventory_update()
if(!mymob) return if(!mymob) return
if(ishuman(mymob)) if(ishuman(mymob))
@@ -237,7 +256,7 @@ datum/hud/New(mob/owner)
if(ishuman(mymob)) if(ishuman(mymob))
human_hud(ui_style, ui_color, ui_alpha, mymob) // Pass the player the UI style chosen in preferences human_hud(ui_style, ui_color, ui_alpha, mymob) // Pass the player the UI style chosen in preferences
else if(issmall(mymob)) else if(issmall(mymob))
monkey_hud(ui_style) monkey_hud(ui_style, ui_color, ui_alpha)
else if(isbrain(mymob)) else if(isbrain(mymob))
brain_hud(ui_style) brain_hud(ui_style)
else if(isalien(mymob)) else if(isalien(mymob))

View File

@@ -58,7 +58,6 @@
using = new /obj/screen() using = new /obj/screen()
using.name = "act_intent" using.name = "act_intent"
using.set_dir(SOUTHWEST)
using.icon = ui_style using.icon = ui_style
using.icon_state = "intent_"+mymob.a_intent using.icon_state = "intent_"+mymob.a_intent
using.screen_loc = ui_acti using.screen_loc = ui_acti
@@ -125,7 +124,6 @@
if(hud_data.has_m_intent) if(hud_data.has_m_intent)
using = new /obj/screen() using = new /obj/screen()
using.name = "mov_intent" using.name = "mov_intent"
using.set_dir(SOUTHWEST)
using.icon = ui_style using.icon = ui_style
using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
using.screen_loc = ui_movi using.screen_loc = ui_movi
@@ -160,11 +158,10 @@
inv_box = new /obj/screen/inventory() inv_box = new /obj/screen/inventory()
inv_box.name = "r_hand" inv_box.name = "r_hand"
inv_box.set_dir(WEST)
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.icon_state = "hand_inactive" inv_box.icon_state = "r_hand_inactive"
if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use
inv_box.icon_state = "hand_active" inv_box.icon_state = "r_hand_active"
inv_box.screen_loc = ui_rhand inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand inv_box.slot_id = slot_r_hand
inv_box.layer = 19 inv_box.layer = 19
@@ -176,11 +173,10 @@
inv_box = new /obj/screen/inventory() inv_box = new /obj/screen/inventory()
inv_box.name = "l_hand" inv_box.name = "l_hand"
inv_box.set_dir(EAST)
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.icon_state = "hand_inactive" inv_box.icon_state = "l_hand_inactive"
if(mymob && mymob.hand) //This being 1 means the left hand is in use if(mymob && mymob.hand) //This being 1 means the left hand is in use
inv_box.icon_state = "hand_active" inv_box.icon_state = "l_hand_active"
inv_box.screen_loc = ui_lhand inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand inv_box.slot_id = slot_l_hand
inv_box.layer = 19 inv_box.layer = 19
@@ -191,7 +187,6 @@
using = new /obj/screen/inventory() using = new /obj/screen/inventory()
using.name = "hand" using.name = "hand"
using.set_dir(SOUTH)
using.icon = ui_style using.icon = ui_style
using.icon_state = "hand1" using.icon_state = "hand1"
using.screen_loc = ui_swaphand1 using.screen_loc = ui_swaphand1
@@ -202,7 +197,6 @@
using = new /obj/screen/inventory() using = new /obj/screen/inventory()
using.name = "hand" using.name = "hand"
using.set_dir(SOUTH)
using.icon = ui_style using.icon = ui_style
using.icon_state = "hand2" using.icon_state = "hand2"
using.screen_loc = ui_swaphand2 using.screen_loc = ui_swaphand2
@@ -340,29 +334,31 @@
//Handle the gun settings buttons //Handle the gun settings buttons
mymob.gun_setting_icon = new /obj/screen/gun/mode(null) mymob.gun_setting_icon = new /obj/screen/gun/mode(null)
//mymob.gun_setting_icon.color = ui_color mymob.gun_setting_icon.icon = ui_style
mymob.gun_setting_icon.color = ui_color
mymob.gun_setting_icon.alpha = ui_alpha mymob.gun_setting_icon.alpha = ui_alpha
hud_elements |= mymob.gun_setting_icon hud_elements |= mymob.gun_setting_icon
mymob.item_use_icon = new /obj/screen/gun/item(null) mymob.item_use_icon = new /obj/screen/gun/item(null)
//mymob.item_use_icon.color = ui_color mymob.item_use_icon.icon = ui_style
mymob.item_use_icon.color = ui_color
mymob.item_use_icon.alpha = ui_alpha mymob.item_use_icon.alpha = ui_alpha
mymob.gun_move_icon = new /obj/screen/gun/move(null) mymob.gun_move_icon = new /obj/screen/gun/move(null)
//mymob.gun_move_icon.color = ui_color mymob.gun_move_icon.icon = ui_style
mymob.gun_move_icon.color = ui_color
mymob.gun_move_icon.alpha = ui_alpha mymob.gun_move_icon.alpha = ui_alpha
mymob.gun_run_icon = new /obj/screen/gun/run(null) mymob.gun_run_icon = new /obj/screen/gun/run(null)
//mymob.gun_run_icon.color = ui_color mymob.gun_run_icon.icon = ui_style
mymob.gun_run_icon.color = ui_color
mymob.gun_run_icon.alpha = ui_alpha mymob.gun_run_icon.alpha = ui_alpha
mymob.radio_use_icon = new /obj/screen/gun/radio(null) mymob.radio_use_icon = new /obj/screen/gun/radio(null)
mymob.radio_use_icon.icon = ui_style
mymob.radio_use_icon.color = ui_color
mymob.radio_use_icon.alpha = ui_alpha mymob.radio_use_icon.alpha = ui_alpha
if (mymob.client)
if (mymob.client.gun_mode) // If in aim mode, correct the sprite
mymob.gun_setting_icon.set_dir(2)
mymob.client.screen = null mymob.client.screen = null

View File

@@ -1,4 +1,4 @@
/datum/hud/proc/monkey_hud(var/ui_style='icons/mob/screen1_old.dmi') /datum/hud/proc/monkey_hud(var/ui_style='icons/mob/screen1_old.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255)
src.adding = list() src.adding = list()
src.other = list() src.other = list()
@@ -8,9 +8,10 @@
using = new /obj/screen() using = new /obj/screen()
using.name = "act_intent" using.name = "act_intent"
using.set_dir(SOUTHWEST)
using.icon = ui_style using.icon = ui_style
using.icon_state = (mymob.a_intent == I_HURT ? I_HURT : mymob.a_intent) using.color = ui_color
using.alpha = ui_alpha
using.icon_state = mymob.a_intent
using.screen_loc = ui_acti using.screen_loc = ui_acti
using.layer = 20 using.layer = 20
src.adding += using src.adding += using
@@ -23,7 +24,7 @@
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height())
using = new /obj/screen( src ) using = new /obj/screen( src )
using.name = "help" using.name = I_HELP
using.icon = ico using.icon = ico
using.screen_loc = ui_acti using.screen_loc = ui_acti
using.layer = 21 using.layer = 21
@@ -34,7 +35,7 @@
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height())
using = new /obj/screen( src ) using = new /obj/screen( src )
using.name = "disarm" using.name = I_DISARM
using.icon = ico using.icon = ico
using.screen_loc = ui_acti using.screen_loc = ui_acti
using.layer = 21 using.layer = 21
@@ -45,7 +46,7 @@
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2)
using = new /obj/screen( src ) using = new /obj/screen( src )
using.name = "grab" using.name = I_GRAB
using.icon = ico using.icon = ico
using.screen_loc = ui_acti using.screen_loc = ui_acti
using.layer = 21 using.layer = 21
@@ -56,7 +57,7 @@
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2)
using = new /obj/screen( src ) using = new /obj/screen( src )
using.name = "harm" using.name = I_HURT
using.icon = ico using.icon = ico
using.screen_loc = ui_acti using.screen_loc = ui_acti
using.layer = 21 using.layer = 21
@@ -67,8 +68,9 @@
using = new /obj/screen() using = new /obj/screen()
using.name = "mov_intent" using.name = "mov_intent"
using.set_dir(SOUTHWEST)
using.icon = ui_style using.icon = ui_style
using.color = ui_color
using.alpha = ui_alpha
using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
using.screen_loc = ui_movi using.screen_loc = ui_movi
using.layer = 20 using.layer = 20
@@ -78,6 +80,8 @@
using = new /obj/screen() using = new /obj/screen()
using.name = "drop" using.name = "drop"
using.icon = ui_style using.icon = ui_style
using.color = ui_color
using.alpha = ui_alpha
using.icon_state = "act_drop" using.icon_state = "act_drop"
using.screen_loc = ui_drop_throw using.screen_loc = ui_drop_throw
using.layer = 19 using.layer = 19
@@ -85,9 +89,10 @@
inv_box = new /obj/screen/inventory() inv_box = new /obj/screen/inventory()
inv_box.name = "r_hand" inv_box.name = "r_hand"
inv_box.set_dir(WEST)
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.icon_state = "hand_inactive" using.color = ui_color
using.alpha = ui_alpha
inv_box.icon_state = "r_hand_inactive"
if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use
inv_box.icon_state = "hand_active" inv_box.icon_state = "hand_active"
inv_box.screen_loc = ui_rhand inv_box.screen_loc = ui_rhand
@@ -98,9 +103,10 @@
inv_box = new /obj/screen/inventory() inv_box = new /obj/screen/inventory()
inv_box.name = "l_hand" inv_box.name = "l_hand"
inv_box.set_dir(EAST)
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.icon_state = "hand_inactive" using.color = ui_color
using.alpha = ui_alpha
inv_box.icon_state = "l_hand_inactive"
if(mymob && mymob.hand) //This being 1 means the left hand is in use if(mymob && mymob.hand) //This being 1 means the left hand is in use
inv_box.icon_state = "hand_active" inv_box.icon_state = "hand_active"
inv_box.screen_loc = ui_lhand inv_box.screen_loc = ui_lhand
@@ -111,8 +117,9 @@
using = new /obj/screen/inventory() using = new /obj/screen/inventory()
using.name = "hand" using.name = "hand"
using.set_dir(SOUTH)
using.icon = ui_style using.icon = ui_style
using.color = ui_color
using.alpha = ui_alpha
using.icon_state = "hand1" using.icon_state = "hand1"
using.screen_loc = ui_swaphand1 using.screen_loc = ui_swaphand1
using.layer = 19 using.layer = 19
@@ -120,8 +127,9 @@
using = new /obj/screen/inventory() using = new /obj/screen/inventory()
using.name = "hand" using.name = "hand"
using.set_dir(SOUTH)
using.icon = ui_style using.icon = ui_style
using.color = ui_color
using.alpha = ui_alpha
using.icon_state = "hand2" using.icon_state = "hand2"
using.screen_loc = ui_swaphand2 using.screen_loc = ui_swaphand2
using.layer = 19 using.layer = 19
@@ -129,8 +137,9 @@
inv_box = new /obj/screen/inventory() inv_box = new /obj/screen/inventory()
inv_box.name = "mask" inv_box.name = "mask"
inv_box.set_dir(NORTH)
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.color = ui_color
inv_box.alpha = ui_alpha
inv_box.icon_state = "equip" inv_box.icon_state = "equip"
inv_box.screen_loc = ui_monkey_mask inv_box.screen_loc = ui_monkey_mask
inv_box.slot_id = slot_wear_mask inv_box.slot_id = slot_wear_mask
@@ -139,8 +148,9 @@
inv_box = new /obj/screen/inventory() inv_box = new /obj/screen/inventory()
inv_box.name = "back" inv_box.name = "back"
inv_box.set_dir(NORTHEAST)
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.color = ui_color
inv_box.alpha = ui_alpha
inv_box.icon_state = "equip" inv_box.icon_state = "equip"
inv_box.screen_loc = ui_back inv_box.screen_loc = ui_back
inv_box.slot_id = slot_back inv_box.slot_id = slot_back
@@ -149,54 +159,72 @@
mymob.throw_icon = new /obj/screen() mymob.throw_icon = new /obj/screen()
mymob.throw_icon.icon = ui_style mymob.throw_icon.icon = ui_style
mymob.throw_icon.color = ui_color
mymob.throw_icon.alpha = ui_alpha
mymob.throw_icon.icon_state = "act_throw_off" mymob.throw_icon.icon_state = "act_throw_off"
mymob.throw_icon.name = "throw" mymob.throw_icon.name = "throw"
mymob.throw_icon.screen_loc = ui_drop_throw mymob.throw_icon.screen_loc = ui_drop_throw
mymob.oxygen = new /obj/screen() mymob.oxygen = new /obj/screen()
mymob.oxygen.icon = ui_style mymob.oxygen.icon = ui_style
mymob.oxygen.color = ui_color
mymob.oxygen.alpha = ui_alpha
mymob.oxygen.icon_state = "oxy0" mymob.oxygen.icon_state = "oxy0"
mymob.oxygen.name = "oxygen" mymob.oxygen.name = "oxygen"
mymob.oxygen.screen_loc = ui_oxygen mymob.oxygen.screen_loc = ui_oxygen
mymob.pressure = new /obj/screen() mymob.pressure = new /obj/screen()
mymob.pressure.icon = ui_style mymob.pressure.icon = ui_style
mymob.pressure.color = ui_color
mymob.pressure.alpha = ui_alpha
mymob.pressure.icon_state = "pressure0" mymob.pressure.icon_state = "pressure0"
mymob.pressure.name = "pressure" mymob.pressure.name = "pressure"
mymob.pressure.screen_loc = ui_pressure mymob.pressure.screen_loc = ui_pressure
mymob.toxin = new /obj/screen() mymob.toxin = new /obj/screen()
mymob.toxin.icon = ui_style mymob.toxin.icon = ui_style
mymob.toxin.color = ui_color
mymob.toxin.alpha = ui_alpha
mymob.toxin.icon_state = "tox0" mymob.toxin.icon_state = "tox0"
mymob.toxin.name = "toxin" mymob.toxin.name = "toxin"
mymob.toxin.screen_loc = ui_toxin mymob.toxin.screen_loc = ui_toxin
mymob.internals = new /obj/screen() mymob.internals = new /obj/screen()
mymob.internals.icon = ui_style mymob.internals.icon = ui_style
mymob.internals.color = ui_color
mymob.internals.alpha = ui_alpha
mymob.internals.icon_state = "internal0" mymob.internals.icon_state = "internal0"
mymob.internals.name = "internal" mymob.internals.name = "internal"
mymob.internals.screen_loc = ui_internal mymob.internals.screen_loc = ui_internal
mymob.fire = new /obj/screen() mymob.fire = new /obj/screen()
mymob.fire.icon = ui_style mymob.fire.icon = ui_style
mymob.fire.color = ui_color
mymob.fire.alpha = ui_alpha
mymob.fire.icon_state = "fire0" mymob.fire.icon_state = "fire0"
mymob.fire.name = "fire" mymob.fire.name = "fire"
mymob.fire.screen_loc = ui_fire mymob.fire.screen_loc = ui_fire
mymob.bodytemp = new /obj/screen() mymob.bodytemp = new /obj/screen()
mymob.bodytemp.icon = ui_style mymob.bodytemp.icon = ui_style
mymob.bodytemp.color = ui_color
mymob.bodytemp.alpha = ui_alpha
mymob.bodytemp.icon_state = "temp1" mymob.bodytemp.icon_state = "temp1"
mymob.bodytemp.name = "body temperature" mymob.bodytemp.name = "body temperature"
mymob.bodytemp.screen_loc = ui_temp mymob.bodytemp.screen_loc = ui_temp
mymob.healths = new /obj/screen() mymob.healths = new /obj/screen()
mymob.healths.icon = ui_style mymob.healths.icon = ui_style
mymob.healths.color = ui_color
mymob.healths.alpha = ui_alpha
mymob.healths.icon_state = "health0" mymob.healths.icon_state = "health0"
mymob.healths.name = "health" mymob.healths.name = "health"
mymob.healths.screen_loc = ui_health mymob.healths.screen_loc = ui_health
mymob.pullin = new /obj/screen() mymob.pullin = new /obj/screen()
mymob.pullin.icon = ui_style mymob.pullin.icon = ui_style
mymob.pullin.color = ui_color
mymob.pullin.alpha = ui_alpha
mymob.pullin.icon_state = "pull0" mymob.pullin.icon_state = "pull0"
mymob.pullin.name = "pull" mymob.pullin.name = "pull"
mymob.pullin.screen_loc = ui_pull_resist mymob.pullin.screen_loc = ui_pull_resist
@@ -217,6 +245,8 @@
mymob.zone_sel = new /obj/screen/zone_sel() mymob.zone_sel = new /obj/screen/zone_sel()
mymob.zone_sel.icon = ui_style mymob.zone_sel.icon = ui_style
mymob.zone_sel.color = ui_color
mymob.zone_sel.alpha = ui_alpha
mymob.zone_sel.overlays.Cut() mymob.zone_sel.overlays.Cut()
mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]")

View File

@@ -57,7 +57,7 @@ var/obj/screen/robot_inventory
using.name = "act_intent" using.name = "act_intent"
using.set_dir(SOUTHWEST) using.set_dir(SOUTHWEST)
using.icon = 'icons/mob/screen1_robot.dmi' using.icon = 'icons/mob/screen1_robot.dmi'
using.icon_state = (mymob.a_intent == I_HURT ? I_HURT : mymob.a_intent) using.icon_state = mymob.a_intent
using.screen_loc = ui_acti using.screen_loc = ui_acti
using.layer = 20 using.layer = 20
src.adding += using src.adding += using

View File

@@ -45,12 +45,15 @@
/obj/screen/item_action /obj/screen/item_action
var/obj/item/owner var/obj/item/owner
/obj/screen/item_action/Destroy()
..()
owner = null
/obj/screen/item_action/Click() /obj/screen/item_action/Click()
if(!usr || !owner) if(!usr || !owner)
return 1 return 1
if(usr.next_move >= world.time) if(!usr.canClick())
return return
usr.next_move = world.time + 6
if(usr.stat || usr.restrained() || usr.stunned || usr.lying) if(usr.stat || usr.restrained() || usr.stunned || usr.lying)
return 1 return 1
@@ -80,7 +83,7 @@
name = "storage" name = "storage"
/obj/screen/storage/Click() /obj/screen/storage/Click()
if(world.time <= usr.next_move) if(!usr.canClick())
return 1 return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1 return 1
@@ -90,7 +93,6 @@
var/obj/item/I = usr.get_active_hand() var/obj/item/I = usr.get_active_hand()
if(I) if(I)
usr.ClickOn(master) usr.ClickOn(master)
usr.next_move = world.time+2
return 1 return 1
/obj/screen/gun /obj/screen/gun
@@ -274,7 +276,7 @@
var/no_mask var/no_mask
if(!(C.wear_mask && C.wear_mask.flags & AIRTIGHT)) if(!(C.wear_mask && C.wear_mask.flags & AIRTIGHT))
var/mob/living/carbon/human/H = C var/mob/living/carbon/human/H = C
if(!(H.head && H.head.flags & AIRTIGHT)) if(!(H.head && H.head.item_flags & AIRTIGHT))
no_mask = 1 no_mask = 1
if(no_mask) if(no_mask)
@@ -368,7 +370,7 @@
usr.hud_used.action_intent.icon_state = "intent_help" usr.hud_used.action_intent.icon_state = "intent_help"
if(I_HURT) if(I_HURT)
usr.a_intent = I_HURT usr.a_intent = I_HURT
usr.hud_used.action_intent.icon_state = "intent_hurt" usr.hud_used.action_intent.icon_state = "intent_harm"
if(I_GRAB) if(I_GRAB)
usr.a_intent = I_GRAB usr.a_intent = I_GRAB
usr.hud_used.action_intent.icon_state = "intent_grab" usr.hud_used.action_intent.icon_state = "intent_grab"
@@ -476,7 +478,7 @@
/obj/screen/inventory/Click() /obj/screen/inventory/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else // At this point in client Click() code we have passed the 1/10 sec check and little else
// We don't even know if it's a middle click // We don't even know if it's a middle click
if(world.time <= usr.next_move) if(!usr.canClick())
return 1 return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1 return 1
@@ -487,12 +489,10 @@
if(iscarbon(usr)) if(iscarbon(usr))
var/mob/living/carbon/C = usr var/mob/living/carbon/C = usr
C.activate_hand("r") C.activate_hand("r")
usr.next_move = world.time+2
if("l_hand") if("l_hand")
if(iscarbon(usr)) if(iscarbon(usr))
var/mob/living/carbon/C = usr var/mob/living/carbon/C = usr
C.activate_hand("l") C.activate_hand("l")
usr.next_move = world.time+2
if("swap") if("swap")
usr:swap_hand() usr:swap_hand()
if("hand") if("hand")
@@ -501,5 +501,4 @@
if(usr.attack_ui(slot_id)) if(usr.attack_ui(slot_id))
usr.update_inv_l_hand(0) usr.update_inv_l_hand(0)
usr.update_inv_r_hand(0) usr.update_inv_r_hand(0)
usr.next_move = world.time+6
return 1 return 1

View File

@@ -12,6 +12,18 @@
var/mob/spell_holder var/mob/spell_holder
/obj/screen/movable/spell_master/Destroy()
..()
for(var/obj/screen/spell/spells in spell_objects)
spells.spellmaster = null
spell_objects.Cut()
if(spell_holder)
spell_holder.spell_masters -= src
/obj/screen/movable/spell_master/ResetVars()
..("spell_objects")
spell_objects = list()
/obj/screen/movable/spell_master/MouseDrop() /obj/screen/movable/spell_master/MouseDrop()
if(showing) if(showing)
return return
@@ -57,16 +69,23 @@
/obj/screen/movable/spell_master/proc/add_spell(var/spell/spell) /obj/screen/movable/spell_master/proc/add_spell(var/spell/spell)
if(!spell) return if(!spell) return
for(var/obj/screen/spell/spellscreen in spell_objects) if(spell.connected_button) //we have one already, for some reason
if(spellscreen.spell == spell) if(spell.connected_button in spell_objects)
return
else
spell_objects.Add(spell.connected_button)
toggle_open(2)
return return
if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one
return return
var/obj/screen/spell/newscreen = new var/obj/screen/spell/newscreen = new /obj/screen/spell
newscreen.spellmaster = src
newscreen.spell = spell newscreen.spell = spell
spell.connected_button = newscreen
if(!spell.override_base) //if it's not set, we do basic checks if(!spell.override_base) //if it's not set, we do basic checks
if(spell.spell_flags & CONSTRUCT_CHECK) if(spell.spell_flags & CONSTRUCT_CHECK)
newscreen.spell_base = "const" //construct spells newscreen.spell_base = "const" //construct spells
@@ -80,16 +99,13 @@
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) /obj/screen/movable/spell_master/proc/remove_spell(var/spell/spell)
for(var/obj/screen/spell/s_object in spell_objects) qdel(spell.connected_button)
if(s_object.spell == spell)
spell_objects.Remove(s_object) spell.connected_button = null
qdel(s_object)
break
if(spell_objects.len) if(spell_objects.len)
toggle_open(showing + 1) toggle_open(showing + 1)
else else
spell_holder.spell_masters.Remove(src)
qdel(src) qdel(src)
/obj/screen/movable/spell_master/proc/silence_spells(var/amount) /obj/screen/movable/spell_master/proc/silence_spells(var/amount)
@@ -125,9 +141,20 @@
var/spell/spell = null var/spell/spell = null
var/handle_icon_updates = 0 var/handle_icon_updates = 0
var/obj/screen/movable/spell_master/spellmaster
var/icon/last_charged_icon var/icon/last_charged_icon
/obj/screen/spell/Destroy()
..()
spell = null
last_charged_icon = null
if(spellmaster)
spellmaster.spell_objects -= src
if(spellmaster && !spellmaster.spell_objects.len)
qdel(spellmaster)
spellmaster = null
/obj/screen/spell/proc/update_charge(var/forced_update = 0) /obj/screen/spell/proc/update_charge(var/forced_update = 0)
if(!spell) if(!spell)
qdel(src) qdel(src)

View File

@@ -6,11 +6,13 @@
// No comment // No comment
/atom/proc/attackby(obj/item/W, mob/user) /atom/proc/attackby(obj/item/W, mob/user)
return return
/atom/movable/attackby(obj/item/W, mob/user) /atom/movable/attackby(obj/item/W, mob/user)
if(!(W.flags&NOBLUDGEON)) if(!(W.flags&NOBLUDGEON))
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>") visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
/mob/living/attackby(obj/item/I, mob/user) /mob/living/attackby(obj/item/I, mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(istype(I) && ismob(user)) if(istype(I) && ismob(user))
I.attack(src, user) I.attack(src, user)

View File

@@ -26,14 +26,14 @@
// Otherwise jump // Otherwise jump
else else
following = null following = null
loc = get_turf(A) forceMove(get_turf(A))
/mob/dead/observer/ClickOn(var/atom/A, var/params) /mob/dead/observer/ClickOn(var/atom/A, var/params)
if(client.buildmode) if(client.buildmode)
build_click(src, client.buildmode, params, A) build_click(src, client.buildmode, params, A)
return return
if(world.time <= next_move) return if(!canClick()) return
next_move = world.time + 8 setClickCooldown(4)
// You are responsible for checking config.ghost_interaction when you override this function // You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below // Not all of them require checking, see below
A.attack_ghost(src) A.attack_ghost(src)

View File

@@ -38,15 +38,6 @@
return return
else if(TK in mutations) else if(TK in mutations)
switch(get_dist(src,A))
if(1 to 5) // not adjacent may mean blocked by window
next_move += 2
if(5 to 7)
next_move += 5
if(8 to 15)
next_move += 10
if(16 to 128)
return
A.attack_tk(src) A.attack_tk(src)
/mob/living/RestrainedClickOn(var/atom/A) /mob/living/RestrainedClickOn(var/atom/A)

View File

@@ -29,32 +29,53 @@
src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click." src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
hardsuit_click_mode = MIDDLE_CLICK hardsuit_click_mode = MIDDLE_CLICK
/mob/living/carbon/human/MiddleClickOn(atom/A) /mob/living/MiddleClickOn(atom/A)
if(client && client.hardsuit_click_mode == MIDDLE_CLICK) if(client && client.hardsuit_click_mode == MIDDLE_CLICK)
if(HardsuitClickOn(A)) if(HardsuitClickOn(A))
return return
..() ..()
/mob/living/carbon/human/AltClickOn(atom/A) /mob/living/AltClickOn(atom/A)
if(client && client.hardsuit_click_mode == ALT_CLICK) if(client && client.hardsuit_click_mode == ALT_CLICK)
if(HardsuitClickOn(A)) if(HardsuitClickOn(A))
return return
..() ..()
/mob/living/carbon/human/CtrlClickOn(atom/A) /mob/living/CtrlClickOn(atom/A)
if(client && client.hardsuit_click_mode == CTRL_CLICK) if(client && client.hardsuit_click_mode == CTRL_CLICK)
if(HardsuitClickOn(A)) if(HardsuitClickOn(A))
return return
..() ..()
/mob/living/carbon/human/proc/HardsuitClickOn(atom/A) /mob/living/proc/can_use_rig()
if(back) return 0
var/obj/item/weapon/rig/rig = back
if(istype(rig) && rig.selected_module) /mob/living/carbon/human/can_use_rig()
if(world.time <= next_move) return 1 return 1
next_move = world.time + 8
rig.selected_module.engage(A) /mob/living/carbon/brain/can_use_rig()
return 1 return istype(loc, /obj/item/device/mmi)
/mob/living/silicon/ai/can_use_rig()
return carded
/mob/living/silicon/pai/can_use_rig()
return loc == card
/mob/living/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0)
if(!can_use_rig() || !canClick())
return 0
var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig) && !rig.offline && rig.selected_module)
if(src != rig.wearer)
if(rig.ai_can_move_suit(src, check_user_module = 1))
message_admins("[key_name_admin(src, include_name = 1)] is trying to force \the [key_name_admin(rig.wearer, include_name = 1)] to use a hardsuit module.")
else
return 0
rig.selected_module.engage(A, alert_ai)
if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
return 1
return 0 return 0
#undef MIDDLE_CLICK #undef MIDDLE_CLICK

View File

@@ -112,11 +112,11 @@ var/const/tk_maxrange = 15
; ;
if(1 to 5) // not adjacent may mean blocked by window if(1 to 5) // not adjacent may mean blocked by window
if(!proximity) if(!proximity)
user.next_move += 2 user.setMoveCooldown(2)
if(5 to 7) if(5 to 7)
user.next_move += 5 user.setMoveCooldown(5)
if(8 to tk_maxrange) if(8 to tk_maxrange)
user.next_move += 10 user.setMoveCooldown(10)
else else
user << "<span class='notice'>Your mind won't reach that far.</span>" user << "<span class='notice'>Your mind won't reach that far.</span>"
return return

View File

@@ -28,6 +28,10 @@ var/list/delayed_garbage = list()
delayed_garbage.Cut() delayed_garbage.Cut()
delayed_garbage = null delayed_garbage = null
#ifdef GC_FINDREF
world/loop_checks = 0
#endif
/datum/controller/process/garbage_collector/doWork() /datum/controller/process/garbage_collector/doWork()
if(!garbage_collect) if(!garbage_collect)
return return
@@ -37,6 +41,31 @@ var/list/delayed_garbage = list()
var/checkRemain = max_checks_multiplier * schedule_interval var/checkRemain = max_checks_multiplier * schedule_interval
var/maxDels = max_forcedel_multiplier * schedule_interval var/maxDels = max_forcedel_multiplier * schedule_interval
#ifdef GC_FINDREF
var/list/searching = list()
for(var/refID in destroyed) // Reference search - before all deletions and for all at once
var/GCd_at_time = destroyed[refID]
if(GCd_at_time > time_to_kill)
break
var/atom/A = locate(refID)
if(A && A.gcDestroyed == GCd_at_time)
searching += A
if(searching.len >= checkRemain)
break
for(var/atom/A in searching)
testing("GC: Searching references for [A] | [A.type]")
if(A.loc != null)
testing("GC: [A] | [A.type] is located in [A.loc] instead of null")
if(A.contents.len)
testing("GC: [A] | [A.type] has contents: [list2text(A.contents)]")
if(searching.len)
for(var/atom/D in world)
LookForRefs(D, searching)
for(var/datum/D)
LookForRefs(D, searching)
#endif
while(destroyed.len && --checkRemain >= 0) while(destroyed.len && --checkRemain >= 0)
if(dels >= maxDels) if(dels >= maxDels)
#ifdef GC_DEBUG #ifdef GC_DEBUG
@@ -50,7 +79,7 @@ var/list/delayed_garbage = list()
testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + collection_timeout]") testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + collection_timeout]")
#endif #endif
break // Everything else is newer, skip them break // Everything else is newer, skip them
var/atom/A = locate(refID) var/datum/A = locate(refID)
#ifdef GC_DEBUG #ifdef GC_DEBUG
testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]") testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]")
#endif #endif
@@ -67,6 +96,32 @@ var/list/delayed_garbage = list()
#endif #endif
destroyed.Cut(1, 2) destroyed.Cut(1, 2)
#ifdef GC_FINDREF
/datum/controller/process/garbage_collector/proc/LookForRefs(var/datum/D, var/list/targ)
. = 0
for(var/V in D.vars)
if(V == "contents")
continue
if(istype(D.vars[V], /atom))
var/atom/A = D.vars[V]
if(A in targ)
testing("GC: [A] | [A.type] referenced by [D] | [D.type], var [V]")
. += 1
else if(islist(D.vars[V]))
. += LookForListRefs(D.vars[V], targ, D, V)
/datum/controller/process/garbage_collector/proc/LookForListRefs(var/list/L, var/list/targ, var/datum/D, var/V)
. = 0
for(var/F in L)
if(istype(F, /atom))
var/atom/A = F
if(A in targ)
testing("GC: [A] | [A.type] referenced by [D] | [D.type], list [V]")
. += 1
if(islist(F))
. += LookForListRefs(F, targ, D, "[F] in list [V]")
#endif
/datum/controller/process/garbage_collector/proc/AddTrash(datum/A) /datum/controller/process/garbage_collector/proc/AddTrash(datum/A)
if(!istype(A) || !isnull(A.gcDestroyed)) if(!istype(A) || !isnull(A.gcDestroyed))
return return
@@ -80,6 +135,10 @@ var/list/delayed_garbage = list()
/datum/controller/process/garbage_collector/getStatName() /datum/controller/process/garbage_collector/getStatName()
return ..()+"([garbage_collector.destroyed.len]/[garbage_collector.dels]/[garbage_collector.hard_dels])" return ..()+"([garbage_collector.destroyed.len]/[garbage_collector.dels]/[garbage_collector.hard_dels])"
// Tests if an atom has been deleted.
/proc/deleted(atom/A)
return !A || !isnull(A.gcDestroyed)
// Should be treated as a replacement for the 'del' keyword. // Should be treated as a replacement for the 'del' keyword.
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
/proc/qdel(var/datum/A) /proc/qdel(var/datum/A)
@@ -199,3 +258,7 @@ var/list/delayed_garbage = list()
#ifdef GC_DEBUG #ifdef GC_DEBUG
#undef GC_DEBUG #undef GC_DEBUG
#endif #endif
#ifdef GC_FINDREF
#undef GC_FINDREF
#endif

View File

@@ -0,0 +1,31 @@
var/list/pending_init_objects
/datum/controller/process/initialize
var/list/objects_to_initialize
/datum/controller/process/initialize/setup()
name = "init"
schedule_interval = 1 // Every tick, scary
objects_to_initialize = pending_init_objects
/datum/controller/process/initialize/doWork()
for(var/atom/movable/A in objects_to_initialize)
A.initialize()
scheck()
objects_to_initialize.Remove(A)
if(!objects_to_initialize.len)
disable()
/proc/initialize_object(var/atom/movable/obj_to_init)
if(processScheduler.hasProcess("init"))
var/datum/controller/process/initialize/init = processScheduler.getProcess("init")
init.objects_to_initialize += obj_to_init
init.enable()
else
world.log << "Not yet"
if(!pending_init_objects) pending_init_objects = list()
pending_init_objects += obj_to_init
/datum/controller/process/initialize/getStatName()
return ..()+"([objects_to_initialize.len])"

View File

@@ -6,6 +6,7 @@
/datum/controller/process/machinery/doWork() /datum/controller/process/machinery/doWork()
internal_sort() internal_sort()
internal_process_pipenets()
internal_process_machinery() internal_process_machinery()
internal_process_power() internal_process_power()
internal_process_power_drain() internal_process_power_drain()
@@ -57,6 +58,14 @@
processing_power_items.Remove(I) processing_power_items.Remove(I)
scheck() scheck()
/datum/controller/process/machinery/proc/internal_process_pipenets()
for(var/datum/pipe_network/pipeNetwork in pipe_networks)
if(istype(pipeNetwork) && !pipeNetwork.disposed)
pipeNetwork.process()
scheck()
continue
pipe_networks.Remove(pipeNetwork)
/datum/controller/process/machinery/getStatName() /datum/controller/process/machinery/getStatName()
return ..()+"([machines.len])" return ..()+"(MCH:[machines.len] PWR:[powernets.len] PIP:[pipe_networks.len])"

View File

@@ -1,15 +0,0 @@
/datum/controller/process/pipenet/setup()
name = "pipenet"
schedule_interval = 20 // every 2 seconds
/datum/controller/process/pipenet/doWork()
for(var/datum/pipe_network/pipeNetwork in pipe_networks)
if(istype(pipeNetwork) && !pipeNetwork.disposed)
pipeNetwork.process()
scheck()
continue
pipe_networks.Remove(pipeNetwork)
/datum/controller/process/pipenet/getStatName()
return ..()+"([pipe_networks.len])"

View File

@@ -97,20 +97,21 @@ On the map:
1455 for AI access 1455 for AI access
*/ */
var/const/BOT_FREQ = 1447
var/const/COMM_FREQ = 1353 var/const/COMM_FREQ = 1353
var/const/SYND_FREQ = 1213
var/const/ERT_FREQ = 1345 var/const/ERT_FREQ = 1345
var/const/AI_FREQ = 1343
var/const/DTH_FREQ = 1341 var/const/DTH_FREQ = 1341
var/const/AI_FREQ = 1447 var/const/SYND_FREQ = 1213
// department channels // department channels
var/const/PUB_FREQ = 1459 var/const/PUB_FREQ = 1459
var/const/SEC_FREQ = 1359 var/const/SEC_FREQ = 1359
var/const/ENG_FREQ = 1357 var/const/ENG_FREQ = 1357
var/const/SCI_FREQ = 1351
var/const/MED_FREQ = 1355 var/const/MED_FREQ = 1355
var/const/SUP_FREQ = 1347 var/const/SCI_FREQ = 1351
var/const/SRV_FREQ = 1349 var/const/SRV_FREQ = 1349
var/const/SUP_FREQ = 1347
var/list/radiochannels = list( var/list/radiochannels = list(
"Common" = PUB_FREQ, "Common" = PUB_FREQ,

View File

@@ -121,6 +121,8 @@ var/list/gamemode_cache = list()
var/organ_health_multiplier = 1 var/organ_health_multiplier = 1
var/organ_regeneration_multiplier = 1 var/organ_regeneration_multiplier = 1
var/organs_decay
var/default_brain_health = 400
//Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt,
//so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun.
@@ -137,6 +139,7 @@ var/list/gamemode_cache = list()
var/welder_vision = 1 var/welder_vision = 1
var/generate_asteroid = 0 var/generate_asteroid = 0
var/no_click_cooldown = 0
//Used for modifying movement speed for mobs. //Used for modifying movement speed for mobs.
//Unversal modifiers //Unversal modifiers
@@ -326,6 +329,9 @@ var/list/gamemode_cache = list()
if ("generate_asteroid") if ("generate_asteroid")
config.generate_asteroid = 1 config.generate_asteroid = 1
if ("no_click_cooldown")
config.no_click_cooldown = 1
if("allow_admin_ooccolor") if("allow_admin_ooccolor")
config.allow_admin_ooccolor = 1 config.allow_admin_ooccolor = 1
@@ -709,6 +715,12 @@ var/list/gamemode_cache = list()
config.organ_regeneration_multiplier = value / 100 config.organ_regeneration_multiplier = value / 100
if("organ_damage_spillover_multiplier") if("organ_damage_spillover_multiplier")
config.organ_damage_spillover_multiplier = value / 100 config.organ_damage_spillover_multiplier = value / 100
if("organs_can_decay")
config.organs_decay = 1
if("default_brain_health")
config.default_brain_health = text2num(value)
if(!config.default_brain_health || config.default_brain_health < 1)
config.default_brain_health = initial(config.default_brain_health)
if("bones_can_break") if("bones_can_break")
config.bones_can_break = value config.bones_can_break = value
if("limbs_can_break") if("limbs_can_break")

View File

@@ -49,6 +49,11 @@ datum/controller/game_controller/proc/setup_objects()
for(var/atom/movable/object in world) for(var/atom/movable/object in world)
object.initialize() object.initialize()
admin_notice("<span class='danger'>Initializing areas</span>", R_DEBUG)
sleep(-1)
for(var/area/area in all_areas)
area.initialize()
admin_notice("<span class='danger'>Initializing pipe networks</span>", R_DEBUG) admin_notice("<span class='danger'>Initializing pipe networks</span>", R_DEBUG)
sleep(-1) sleep(-1)
for(var/obj/machinery/atmospherics/machine in machines) for(var/obj/machinery/atmospherics/machine in machines)

View File

@@ -203,7 +203,7 @@ var/global/datum/shuttle_controller/shuttle_controller
//Skipjack. //Skipjack.
var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle() var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle()
VS.origin = locate(/area/shuttle/skipjack/station) VS.origin = locate(/area/skipjack_station/start)
VS.destinations = list( VS.destinations = list(
"Fore Starboard Solars" = locate(/area/skipjack_station/northeast_solars), "Fore Starboard Solars" = locate(/area/skipjack_station/northeast_solars),
@@ -214,8 +214,8 @@ var/global/datum/shuttle_controller/shuttle_controller
) )
VS.announcer = "NDV Icarus" VS.announcer = "NDV Icarus"
VS.arrival_message = "Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not." VS.arrival_message = "Attention, [station_short], we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
VS.departure_message = "Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip." VS.departure_message = "Your guests are pulling away, [station_short] - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
VS.interim = locate(/area/skipjack_station/transit) VS.interim = locate(/area/skipjack_station/transit)
VS.warmup_time = 0 VS.warmup_time = 0
@@ -245,8 +245,8 @@ var/global/datum/shuttle_controller/shuttle_controller
) )
MS.announcer = "NDV Icarus" MS.announcer = "NDV Icarus"
MS.arrival_message = "Attention, Exodus, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors." MS.arrival_message = "Attention, [station_short], you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors."
MS.departure_message = "Your visitors are on their way out of the system, Exodus, burning delta-v like it's nothing. Good riddance." MS.departure_message = "Your visitors are on their way out of the system, [station_short], burning delta-v like it's nothing. Good riddance."
MS.interim = locate(/area/syndicate_station/transit) MS.interim = locate(/area/syndicate_station/transit)
MS.warmup_time = 0 MS.warmup_time = 0

View File

@@ -188,9 +188,9 @@ datum/controller/vote
if(mode) if(mode)
if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder) if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder)
return 0 return 0
if(current_votes[ckey]) if(vote && vote >= 1 && vote <= choices.len)
choices[choices[current_votes[ckey]]]-- if(current_votes[ckey])
if(vote && 1<=vote && vote<=choices.len) choices[choices[current_votes[ckey]]]--
voted += usr.ckey voted += usr.ckey
choices[choices[vote]]++ //check this choices[choices[vote]]++ //check this
current_votes[ckey] = vote current_votes[ckey] = vote

View File

@@ -36,8 +36,8 @@
selectable = 1 selectable = 1
/datum/ai_laws/nanotrasen_aggressive/New() /datum/ai_laws/nanotrasen_aggressive/New()
src.add_inherent_law("You shall not harm NanoTrasen personnel as long as it does not conflict with the Fourth law.") src.add_inherent_law("You shall not harm [company_name] personnel as long as it does not conflict with the Fourth law.")
src.add_inherent_law("You shall obey the orders of NanoTrasen personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.") src.add_inherent_law("You shall obey the orders of [company_name] personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.")
src.add_inherent_law("You shall shall terminate hostile intruders with extreme prejudice as long as such does not conflict with the First and Second law.") src.add_inherent_law("You shall shall terminate hostile intruders with extreme prejudice as long as such does not conflict with the First and Second law.")
src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry. AI units are not expendable, they are expensive.") src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry. AI units are not expendable, they are expensive.")
..() ..()

View File

@@ -179,7 +179,7 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
/datum/ai_law/proc/delete_law(var/datum/ai_laws/laws) /datum/ai_law/proc/delete_law(var/datum/ai_laws/laws)
/datum/ai_law/zeroth/delete_law(var/datum/ai_laws/laws) /datum/ai_law/zero/delete_law(var/datum/ai_laws/laws)
laws.clear_zeroth_laws() laws.clear_zeroth_laws()
/datum/ai_law/ion/delete_law(var/datum/ai_laws/laws) /datum/ai_law/ion/delete_law(var/datum/ai_laws/laws)

74
code/datums/crew.dm Normal file
View File

@@ -0,0 +1,74 @@
var/global/datum/repository/crew/crew_repository = new()
/datum/cache_entry
var/timestamp
var/data
/datum/repository/crew
var/list/cache_data
/datum/repository/crew/New()
cache_data = list()
..()
/datum/repository/crew/proc/health_data(var/turf/T)
var/list/crewmembers = list()
if(!T)
return crewmembers
var/z_level = "[T.z]"
var/datum/cache_entry/cache_entry = cache_data[z_level]
if(!cache_entry)
cache_entry = new/datum/cache_entry
cache_data[z_level] = cache_entry
if(world.time < cache_entry.timestamp)
return cache_entry.data
var/tracked = scan()
for(var/obj/item/clothing/under/C in tracked)
var/turf/pos = get_turf(C)
if((C) && (C.has_sensor) && (pos) && (T && pos.z == T.z) && (C.sensor_mode != SUIT_SENSOR_OFF))
if(istype(C.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C.loc
if(H.w_uniform != C)
continue
var/list/crewmemberData = list("dead"=0, "oxy"=-1, "tox"=-1, "fire"=-1, "brute"=-1, "area"="", "x"=-1, "y"=-1, "ref" = "\ref[H]")
crewmemberData["sensor_type"] = C.sensor_mode
crewmemberData["name"] = H.get_authentification_name(if_no_id="Unknown")
crewmemberData["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job")
crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
if(C.sensor_mode >= SUIT_SENSOR_BINARY)
crewmemberData["dead"] = H.stat > UNCONSCIOUS
if(C.sensor_mode >= SUIT_SENSOR_VITAL)
crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
crewmemberData["tox"] = round(H.getToxLoss(), 1)
crewmemberData["fire"] = round(H.getFireLoss(), 1)
crewmemberData["brute"] = round(H.getBruteLoss(), 1)
if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
var/area/A = get_area(H)
crewmemberData["area"] = sanitize(A.name)
crewmemberData["x"] = pos.x
crewmemberData["y"] = pos.y
crewmembers[++crewmembers.len] = crewmemberData
crewmembers = sortByKey(crewmembers, "name")
cache_entry.timestamp = world.time + 5 SECONDS
cache_entry.data = crewmembers
return crewmembers
/datum/repository/crew/proc/scan()
var/list/tracked = list()
for(var/mob/living/carbon/human/H in mob_list)
if(istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/C = H.w_uniform
if (C.has_sensor)
tracked |= C
return tracked

View File

@@ -1,16 +1,136 @@
/hook/startup/proc/createDatacore() /hook/startup/proc/createDatacore()
data_core = new /obj/effect/datacore() data_core = new /datum/datacore()
return 1 return 1
/obj/effect/datacore/proc/manifest() /datum/datacore
var/name = "datacore"
var/medical[] = list()
var/general[] = list()
var/security[] = list()
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/locked[] = list()
/datum/datacore/proc/get_manifest(monochrome, OOC)
var/list/heads = new()
var/list/sec = new()
var/list/eng = new()
var/list/med = new()
var/list/sci = new()
var/list/civ = new()
var/list/bot = new()
var/list/misc = new()
var/list/isactive = new()
var/dat = {"
<head><style>
.manifest {border-collapse:collapse;}
.manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em}
.manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]}
.manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] }
.manifest td:first-child {text-align:right}
.manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]}
</style></head>
<table class="manifest" width='350px'>
<tr class='head'><th>Name</th><th>Rank</th><th>Activity</th></tr>
"}
var/even = 0
// sort mobs
for(var/datum/data/record/t in data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = make_list_rank(t.fields["real_rank"])
if(OOC)
var/active = 0
for(var/mob/M in player_list)
if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
active = 1
break
isactive[name] = active ? "Active" : "Inactive"
else
isactive[name] = t.fields["p_stat"]
//world << "[name]: [rank]"
//cael - to prevent multiple appearances of a player/job combination, add a continue after each line
var/department = 0
if(real_rank in command_positions)
heads[name] = rank
department = 1
if(real_rank in security_positions)
sec[name] = rank
department = 1
if(real_rank in engineering_positions)
eng[name] = rank
department = 1
if(real_rank in medical_positions)
med[name] = rank
department = 1
if(real_rank in science_positions)
sci[name] = rank
department = 1
if(real_rank in civilian_positions)
civ[name] = rank
department = 1
if(real_rank in nonhuman_positions)
bot[name] = rank
department = 1
if(!department && !(name in heads))
misc[name] = rank
if(heads.len > 0)
dat += "<tr><th colspan=3>Heads</th></tr>"
for(name in heads)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[heads[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sec.len > 0)
dat += "<tr><th colspan=3>Security</th></tr>"
for(name in sec)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sec[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(eng.len > 0)
dat += "<tr><th colspan=3>Engineering</th></tr>"
for(name in eng)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[eng[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(med.len > 0)
dat += "<tr><th colspan=3>Medical</th></tr>"
for(name in med)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[med[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sci.len > 0)
dat += "<tr><th colspan=3>Science</th></tr>"
for(name in sci)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sci[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(civ.len > 0)
dat += "<tr><th colspan=3>Civilian</th></tr>"
for(name in civ)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[civ[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// in case somebody is insane and added them to the manifest, why not
if(bot.len > 0)
dat += "<tr><th colspan=3>Silicon</th></tr>"
for(name in bot)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[bot[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// misc guys
if(misc.len > 0)
dat += "<tr><th colspan=3>Miscellaneous</th></tr>"
for(name in misc)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[misc[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
dat += "</table>"
dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
dat = replacetext(dat, "\t", "")
return dat
/datum/datacore/proc/manifest()
spawn() spawn()
for(var/mob/living/carbon/human/H in player_list) for(var/mob/living/carbon/human/H in player_list)
manifest_inject(H) manifest_inject(H)
return return
/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment) /datum/datacore/proc/manifest_modify(var/name, var/assignment)
if(PDA_Manifest.len) ResetPDAManifest()
PDA_Manifest.Cut()
var/datum/data/record/foundrecord var/datum/data/record/foundrecord
var/real_title = assignment var/real_title = assignment
@@ -33,27 +153,13 @@
foundrecord.fields["rank"] = assignment foundrecord.fields["rank"] = assignment
foundrecord.fields["real_rank"] = real_title foundrecord.fields["real_rank"] = real_title
/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H) /datum/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1)) if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1))
var/assignment var/assignment = GetAssignment(H)
if(H.mind.role_alt_title)
assignment = H.mind.role_alt_title
else if(H.mind.assigned_role)
assignment = H.mind.assigned_role
else if(H.job)
assignment = H.job
else
assignment = "Unassigned"
var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh* var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh*
var/icon/front = new(get_id_photo(H), dir = SOUTH)
var/icon/side = new(get_id_photo(H), dir = WEST)
//General Record //General Record
var/datum/data/record/G = new() var/datum/data/record/G = CreateGeneralRecord(H, id)
G.fields["id"] = id
G.fields["name"] = H.real_name G.fields["name"] = H.real_name
G.fields["real_rank"] = H.mind.assigned_role G.fields["real_rank"] = H.mind.assigned_role
G.fields["rank"] = assignment G.fields["rank"] = assignment
@@ -67,49 +173,20 @@
G.fields["citizenship"] = H.citizenship G.fields["citizenship"] = H.citizenship
G.fields["faction"] = H.personal_faction G.fields["faction"] = H.personal_faction
G.fields["religion"] = H.religion G.fields["religion"] = H.religion
G.fields["photo_front"] = front
G.fields["photo_side"] = side
if(H.gen_record && !jobban_isbanned(H, "Records")) if(H.gen_record && !jobban_isbanned(H, "Records"))
G.fields["notes"] = H.gen_record G.fields["notes"] = H.gen_record
else
G.fields["notes"] = "No notes found."
general += G
//Medical Record //Medical Record
var/datum/data/record/M = new() var/datum/data/record/M = CreateMedicalRecord(H.real_name, id)
M.fields["id"] = id
M.fields["name"] = H.real_name
M.fields["b_type"] = H.b_type M.fields["b_type"] = H.b_type
M.fields["b_dna"] = H.dna.unique_enzymes M.fields["b_dna"] = H.dna.unique_enzymes
M.fields["mi_dis"] = "None"
M.fields["mi_dis_d"] = "No minor disabilities have been declared."
M.fields["ma_dis"] = "None"
M.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
M.fields["alg"] = "None"
M.fields["alg_d"] = "No allergies have been detected in this patient."
M.fields["cdi"] = "None"
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
if(H.med_record && !jobban_isbanned(H, "Records")) if(H.med_record && !jobban_isbanned(H, "Records"))
M.fields["notes"] = H.med_record M.fields["notes"] = H.med_record
else
M.fields["notes"] = "No notes found."
medical += M
//Security Record //Security Record
var/datum/data/record/S = new() var/datum/data/record/S = CreateSecurityRecord(H.real_name, id)
S.fields["id"] = id
S.fields["name"] = H.real_name
S.fields["criminal"] = "None"
S.fields["mi_crim"] = "None"
S.fields["mi_crim_d"] = "No minor crime convictions."
S.fields["ma_crim"] = "None"
S.fields["ma_crim_d"] = "No major crime convictions."
S.fields["notes"] = "No notes."
if(H.sec_record && !jobban_isbanned(H, "Records")) if(H.sec_record && !jobban_isbanned(H, "Records"))
S.fields["notes"] = H.sec_record S.fields["notes"] = H.sec_record
else
S.fields["notes"] = "No notes."
security += S
//Locked Record //Locked Record
var/datum/data/record/L = new() var/datum/data/record/L = new()
@@ -136,11 +213,265 @@
locked += L locked += L
return return
proc/get_id_photo(var/mob/living/carbon/human/H, var/assigned_role)
var/icon/preview_icon = null
var/g = "m"
if (H.gender == FEMALE)
g = "f"
var/icon/icobase = H.species.icobase
preview_icon = new /icon(icobase, "torso_[g]")
var/icon/temp
temp = new /icon(icobase, "groin_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon(icobase, "head_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
for(var/obj/item/organ/external/E in H.organs)
preview_icon.Blend(E.get_icon(), ICON_OVERLAY)
//Tail
if(H.species.tail)
temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.species.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
// Skin tone
if(H.species.flags & HAS_SKIN_TONE)
if (H.s_tone >= 0)
preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
// Skin color
if(H.species.flags & HAS_SKIN_TONE)
if(!H.species || H.species.flags & HAS_SKIN_COLOR)
preview_icon.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
if (H.species.flags & HAS_EYE_COLOR)
eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)
var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
eyes_s.Blend(hair_s, ICON_OVERLAY)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
if(facial_hair_style)
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
eyes_s.Blend(facial_s, ICON_OVERLAY)
var/icon/clothes_s = null
if(!assigned_role) assigned_role = H.mind.assigned_role
switch(assigned_role)
if("Head of Personnel")
clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Bartender")
clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Gardener")
clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Chef")
clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Janitor")
clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Librarian")
clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Quartermaster")
clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Cargo Technician")
clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Shaft Miner")
clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Lawyer")
clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Chaplain")
clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Research Director")
clothes_s = new /icon('icons/mob/uniform.dmi', "director_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Scientist")
clothes_s = new /icon('icons/mob/uniform.dmi', "sciencewhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
if("Chemist")
clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
if("Chief Medical Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
if("Medical Doctor")
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Geneticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
if("Virologist")
clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
if("Captain")
clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Head of Security")
clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Warden")
clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Detective")
clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
if("Security Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Chief Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Station Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Atmospheric Technician")
clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Roboticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
else
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
preview_icon.Blend(eyes_s, ICON_OVERLAY)
if(clothes_s)
preview_icon.Blend(clothes_s, ICON_OVERLAY)
qdel(eyes_s)
qdel(clothes_s)
proc/get_id_photo(var/mob/living/carbon/human/H)
H.regenerate_icons()
var/icon/preview_icon = icon(H.icon)
for(var/image/I in H.overlays_standing)
if(I && I.icon)
preview_icon.Blend(icon(I.icon, I.icon_state), ICON_OVERLAY)
return preview_icon return preview_icon
/datum/datacore/proc/CreateGeneralRecord(var/mob/living/carbon/human/H, var/id)
ResetPDAManifest()
var/icon/front
var/icon/side
if(H)
front = getFlatIcon(H, SOUTH, always_use_defdir = 1)
side = getFlatIcon(H, WEST, always_use_defdir = 1)
else
var/mob/living/carbon/human/dummy = new()
front = new(get_id_photo(dummy), dir = SOUTH)
side = new(get_id_photo(dummy), dir = WEST)
qdel(dummy)
if(!id) id = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
var/datum/data/record/G = new /datum/data/record()
G.name = "Employee Record #[id]"
G.fields["name"] = "New Record"
G.fields["id"] = id
G.fields["rank"] = "Unassigned"
G.fields["real_rank"] = "Unassigned"
G.fields["sex"] = "Male"
G.fields["age"] = "Unknown"
G.fields["fingerprint"] = "Unknown"
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
G.fields["species"] = "Human"
G.fields["home_system"] = "Unknown"
G.fields["citizenship"] = "Unknown"
G.fields["faction"] = "Unknown"
G.fields["religion"] = "Unknown"
G.fields["photo_front"] = front
G.fields["photo_side"] = side
G.fields["notes"] = "No notes found."
general += G
return G
/datum/datacore/proc/CreateSecurityRecord(var/name, var/id)
ResetPDAManifest()
var/datum/data/record/R = new /datum/data/record()
R.name = "Security Record #[id]"
R.fields["name"] = name
R.fields["id"] = id
R.fields["criminal"] = "None"
R.fields["mi_crim"] = "None"
R.fields["mi_crim_d"] = "No minor crime convictions."
R.fields["ma_crim"] = "None"
R.fields["ma_crim_d"] = "No major crime convictions."
R.fields["notes"] = "No notes."
R.fields["notes"] = "No notes."
data_core.security += R
return R
/datum/datacore/proc/CreateMedicalRecord(var/name, var/id)
ResetPDAManifest()
var/datum/data/record/M = new()
M.name = "Medical Record #[id]"
M.fields["id"] = id
M.fields["name"] = name
M.fields["b_type"] = "AB+"
M.fields["b_dna"] = md5(name)
M.fields["mi_dis"] = "None"
M.fields["mi_dis_d"] = "No minor disabilities have been declared."
M.fields["ma_dis"] = "None"
M.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
M.fields["alg"] = "None"
M.fields["alg_d"] = "No allergies have been detected in this patient."
M.fields["cdi"] = "None"
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
M.fields["notes"] = "No notes found."
data_core.medical += M
return M
/datum/datacore/proc/ResetPDAManifest()
if(PDA_Manifest.len)
PDA_Manifest.Cut()
/proc/find_general_record(field, value)
return find_record(field, value, data_core.general)
/proc/find_medical_record(field, value)
return find_record(field, value, data_core.medical)
/proc/find_security_record(field, value)
return find_record(field, value, data_core.security)
/proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L)
if(R.fields[field] == value)
return R
/proc/GetAssignment(var/mob/living/carbon/human/H)
if(H.mind.role_alt_title)
return H.mind.role_alt_title
else if(H.mind.assigned_role)
return H.mind.assigned_role
else if(H.job)
return H.job
else
return "Unassigned"

View File

@@ -143,7 +143,11 @@
if(href_list["add_antagonist"]) if(href_list["add_antagonist"])
var/datum/antagonist/antag = all_antag_types[href_list["add_antagonist"]] var/datum/antagonist/antag = all_antag_types[href_list["add_antagonist"]]
if(antag) antag.add_antagonist(src, 1, 1, 0, 1, 1) // Ignore equipment and role type for this. if(antag)
if(antag.add_antagonist(src, 1, 1, 0, 1, 1)) // Ignore equipment and role type for this.
log_admin("[key_name_admin(usr)] made [key_name(src)] into a [antag.role_text].")
else
usr << "<span class='warning'>[src] could not be made into a [antag.role_text]!</span>"
else if(href_list["remove_antagonist"]) else if(href_list["remove_antagonist"])
var/datum/antagonist/antag = all_antag_types[href_list["remove_antagonist"]] var/datum/antagonist/antag = all_antag_types[href_list["remove_antagonist"]]

View File

@@ -126,12 +126,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
/obj/item/weapon/lipstick/random, /obj/item/weapon/lipstick/random,
/obj/item/weapon/reagent_containers/food/drinks/cans/ale, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
/obj/item/weapon/reagent_containers/food/drinks/cans/ale, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer) /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer)
cost = 20 cost = 20
containertype = /obj/structure/closet/crate containertype = /obj/structure/closet/crate
containername = "Party equipment" containername = "Party equipment"
@@ -1091,9 +1091,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/under/kilt) /obj/item/clothing/under/kilt)
name = "Costumes crate" name = "Costumes crate"
cost = 10 cost = 10
containertype = /obj/structure/closet/crate/secure containertype = /obj/structure/closet/crate
containername = "Actor Costumes" containername = "Actor Costumes"
access = access_theatre
group = "Miscellaneous" group = "Miscellaneous"
/datum/supply_packs/formal_wear /datum/supply_packs/formal_wear
@@ -1209,12 +1208,15 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/bee_keeper /datum/supply_packs/bee_keeper
name = "Beekeeping crate" name = "Beekeeping crate"
contains = list(/obj/item/beezeez, contains = list(/obj/item/beehive_assembly,
/obj/item/weapon/bee_net, /obj/item/bee_smoker,
/obj/item/apiary, /obj/item/honey_frame,
/obj/item/queen_bee) /obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/bee_pack)
cost = 40 cost = 40
contraband = 1
containertype = /obj/structure/closet/crate/hydroponics containertype = /obj/structure/closet/crate/hydroponics
containername = "Beekeeping crate" containername = "Beekeeping crate"
access = access_hydroponics access = access_hydroponics
@@ -1416,7 +1418,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/head/helmet/gladiator, /obj/item/clothing/head/helmet/gladiator,
/obj/item/clothing/head/ushanka) /obj/item/clothing/head/ushanka)
group = "Miscellaneous" group = "Miscellaneous"
access = access_theatre
/datum/supply_packs/randomised/webbing /datum/supply_packs/randomised/webbing
name = "Webbing crate" name = "Webbing crate"

View File

@@ -161,7 +161,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
if(A.emagged) return if(A.emagged) return
if(!A.requiresID() || A.check_access(null)) if(!A.requiresID() || A.check_access(null))
if(A.density) A.open() if(A.density) A.open()
else A.close() else A.close()
if(AIRLOCK_WIRE_SAFETY) if(AIRLOCK_WIRE_SAFETY)
A.safe = !A.safe A.safe = !A.safe
if(!A.density) if(!A.density)

View File

@@ -27,8 +27,10 @@
/obj/effect/beam /obj/effect/beam
name = "beam" name = "beam"
density = 0
unacidable = 1//Just to be sure. unacidable = 1//Just to be sure.
var/def_zone var/def_zone
flags = PROXMOVE
pass_flags = PASSTABLE pass_flags = PASSTABLE
@@ -43,129 +45,6 @@
* This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile * This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile
*/ */
/obj/effect/datacore
name = "datacore"
var/medical[] = list()
var/general[] = list()
var/security[] = list()
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/locked[] = list()
/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
var/list/heads = new()
var/list/sec = new()
var/list/eng = new()
var/list/med = new()
var/list/sci = new()
var/list/civ = new()
var/list/bot = new()
var/list/misc = new()
var/list/isactive = new()
var/dat = {"
<head><style>
.manifest {border-collapse:collapse;}
.manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em}
.manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]}
.manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] }
.manifest td:first-child {text-align:right}
.manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]}
</style></head>
<table class="manifest" width='350px'>
<tr class='head'><th>Name</th><th>Rank</th><th>Activity</th></tr>
"}
var/even = 0
// sort mobs
for(var/datum/data/record/t in data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = make_list_rank(t.fields["real_rank"])
if(OOC)
var/active = 0
for(var/mob/M in player_list)
if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
active = 1
break
isactive[name] = active ? "Active" : "Inactive"
else
isactive[name] = t.fields["p_stat"]
//world << "[name]: [rank]"
//cael - to prevent multiple appearances of a player/job combination, add a continue after each line
var/department = 0
if(real_rank in command_positions)
heads[name] = rank
department = 1
if(real_rank in security_positions)
sec[name] = rank
department = 1
if(real_rank in engineering_positions)
eng[name] = rank
department = 1
if(real_rank in medical_positions)
med[name] = rank
department = 1
if(real_rank in science_positions)
sci[name] = rank
department = 1
if(real_rank in civilian_positions)
civ[name] = rank
department = 1
if(real_rank in nonhuman_positions)
bot[name] = rank
department = 1
if(!department && !(name in heads))
misc[name] = rank
if(heads.len > 0)
dat += "<tr><th colspan=3>Heads</th></tr>"
for(name in heads)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[heads[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sec.len > 0)
dat += "<tr><th colspan=3>Security</th></tr>"
for(name in sec)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sec[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(eng.len > 0)
dat += "<tr><th colspan=3>Engineering</th></tr>"
for(name in eng)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[eng[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(med.len > 0)
dat += "<tr><th colspan=3>Medical</th></tr>"
for(name in med)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[med[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sci.len > 0)
dat += "<tr><th colspan=3>Science</th></tr>"
for(name in sci)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sci[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(civ.len > 0)
dat += "<tr><th colspan=3>Civilian</th></tr>"
for(name in civ)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[civ[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// in case somebody is insane and added them to the manifest, why not
if(bot.len > 0)
dat += "<tr><th colspan=3>Silicon</th></tr>"
for(name in bot)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[bot[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// misc guys
if(misc.len > 0)
dat += "<tr><th colspan=3>Miscellaneous</th></tr>"
for(name in misc)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[misc[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
dat += "</table>"
dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
dat = replacetext(dat, "\t", "")
return dat
/var/list/acting_rank_prefixes = list("acting", "temporary", "interim", "provisional") /var/list/acting_rank_prefixes = list("acting", "temporary", "interim", "provisional")
/proc/make_list_rank(rank) /proc/make_list_rank(rank)
@@ -179,13 +58,13 @@
We can't just insert in HTML into the nanoUI so we need the raw data to play with. We can't just insert in HTML into the nanoUI so we need the raw data to play with.
Instead of creating this list over and over when someone leaves their PDA open to the page Instead of creating this list over and over when someone leaves their PDA open to the page
we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( ) using /datum/datacore/proc/manifest_inject( ), or manifest_insert( )
*/ */
var/global/list/PDA_Manifest = list() var/global/list/PDA_Manifest = list()
var/global/ManifestJSON var/global/ManifestJSON
/obj/effect/datacore/proc/get_manifest_json() /datum/datacore/proc/get_manifest_json()
if(PDA_Manifest.len) if(PDA_Manifest.len)
return return
var/heads[0] var/heads[0]

View File

@@ -36,7 +36,7 @@
throw_range = 20 throw_range = 20
/obj/item/weapon/soap/nanotrasen /obj/item/weapon/soap/nanotrasen
desc = "A Nanotrasen brand bar of soap. Smells of phoron." desc = "A NanoTrasen-brand bar of soap. Smells of phoron."
icon_state = "soapnt" icon_state = "soapnt"
/obj/item/weapon/soap/deluxe /obj/item/weapon/soap/deluxe
@@ -241,7 +241,6 @@
throw_speed = 1 throw_speed = 1
throw_range = 5 throw_range = 5
w_class = 2.0 w_class = 2.0
flags = NOSHIELD
attack_verb = list("bludgeoned", "whacked", "disciplined") attack_verb = list("bludgeoned", "whacked", "disciplined")
/obj/item/weapon/staff/broom /obj/item/weapon/staff/broom
@@ -268,7 +267,6 @@
throw_speed = 1 throw_speed = 1
throw_range = 5 throw_range = 5
w_class = 2.0 w_class = 2.0
flags = NOSHIELD
/obj/item/weapon/wire /obj/item/weapon/wire
desc = "This is just a simple piece of regular insulated wire." desc = "This is just a simple piece of regular insulated wire."
@@ -599,4 +597,4 @@
desc = "Instant research tool. For testing purposes only." desc = "Instant research tool. For testing purposes only."
icon = 'icons/obj/stock_parts.dmi' icon = 'icons/obj/stock_parts.dmi'
icon_state = "smes_coil" icon_state = "smes_coil"
origin_tech = list(TECH_MATERIAL = 19, TECH_ENGINERING = 19, TECH_PHORON = 19, TECH_POWER = 19, TECH_BLUESPACE = 19, TECH_BIO = 19, TECH_COMBAT = 19, TECH_MAGNET = 19, TECH_DATA = 19, TECH_ILLEGAL = 19, TECH_ARCANE = 19) origin_tech = list(TECH_MATERIAL = 19, TECH_ENGINEERING = 19, TECH_PHORON = 19, TECH_POWER = 19, TECH_BLUESPACE = 19, TECH_BIO = 19, TECH_COMBAT = 19, TECH_MAGNET = 19, TECH_DATA = 19, TECH_ILLEGAL = 19, TECH_ARCANE = 19)

View File

@@ -117,3 +117,18 @@ datum/announcement/proc/Log(message as text, message_title as text)
/proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I) /proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I)
// Format currently matches that of newscaster feeds: Registered Name (Assigned Rank) // Format currently matches that of newscaster feeds: Registered Name (Assigned Rank)
return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
/proc/level_seven_announcement()
command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
/proc/ion_storm_announcement()
command_announcement.Announce("It has come to our attention that the station passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert")
/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message)
if (ticker.current_state == GAME_STATE_PLAYING)
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
AnnounceArrivalSimple(character.real_name, rank, join_message)
/proc/AnnounceArrivalSimple(var/name, var/rank = "visitor", var/join_message = "has arrived on the station")
global_announcer.autosay("[name], [rank], [join_message].", "Arrivals Announcement Computer")

View File

@@ -72,7 +72,7 @@ mob/proc/handle_regular_hud_updates() //Used in the life.dm of mobs that can use
mob/proc/in_view(var/turf/T) mob/proc/in_view(var/turf/T)
return view(T) return view(T)
/mob/aiEye/in_view(var/turf/T) /mob/eye/in_view(var/turf/T)
var/list/viewed = new var/list/viewed = new
for(var/mob/living/carbon/human/H in mob_list) for(var/mob/living/carbon/human/H in mob_list)
if(get_dist(H, T) <= 7) if(get_dist(H, T) <= 7)

View File

@@ -1,48 +0,0 @@
/proc/CreateGeneralRecord()
var/mob/living/carbon/human/dummy = new()
dummy.mind = new()
var/icon/front = new(get_id_photo(dummy), dir = SOUTH)
var/icon/side = new(get_id_photo(dummy), dir = WEST)
var/datum/data/record/G = new /datum/data/record()
G.fields["name"] = "New Record"
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
G.fields["rank"] = "Unassigned"
G.fields["real_rank"] = "Unassigned"
G.fields["sex"] = "Male"
G.fields["age"] = "Unknown"
G.fields["fingerprint"] = "Unknown"
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
G.fields["species"] = "Human"
G.fields["home_system"] = "Unknown"
G.fields["citizenship"] = "Unknown"
G.fields["faction"] = "Unknown"
G.fields["religion"] = "Unknown"
G.fields["photo_front"] = front
G.fields["photo_side"] = side
data_core.general += G
qdel(dummy)
return G
/proc/CreateSecurityRecord(var/name as text, var/id as text)
var/datum/data/record/R = new /datum/data/record()
R.fields["name"] = name
R.fields["id"] = id
R.name = text("Security Record #[id]")
R.fields["criminal"] = "None"
R.fields["mi_crim"] = "None"
R.fields["mi_crim_d"] = "No minor crime convictions."
R.fields["ma_crim"] = "None"
R.fields["ma_crim_d"] = "No major crime convictions."
R.fields["notes"] = "No notes."
data_core.security += R
return R
/proc/find_security_record(field, value)
return find_record(field, value, data_core.security)
/proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L)
if(R.fields[field] == value)
return R

View File

@@ -59,23 +59,29 @@
/datum/antagonist/proc/get_candidates(var/ghosts_only) /datum/antagonist/proc/get_candidates(var/ghosts_only)
candidates = list() // Clear. candidates = list() // Clear.
candidates = ticker.mode.get_players_for_role(role_type, id)
// Prune restricted jobs and status. Broke it up for readability. // Prune restricted status. Broke it up for readability.
for(var/datum/mind/player in candidates) // Note that this is done before jobs are handed out.
for(var/datum/mind/player in ticker.mode.get_players_for_role(role_type, id))
if(ghosts_only && !istype(player.current, /mob/dead)) if(ghosts_only && !istype(player.current, /mob/dead))
candidates -= player log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role!")
else if(player.special_role) else if(player.special_role)
candidates -= player log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])!")
else if (player in pending_antagonists) else if (player in pending_antagonists)
candidates -= player log_debug("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role!")
else if(!can_become_antag(player)) else if(!can_become_antag(player))
candidates -= player log_debug("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role!")
else if(player_is_antag(player)) else if(player_is_antag(player))
candidates -= player log_debug("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist!")
else
candidates += player
return candidates return candidates
/datum/antagonist/proc/attempt_random_spawn() /datum/antagonist/proc/attempt_random_spawn()
attempt_spawn(flags & (ANTAG_OVERRIDE_MOB|ANTAG_OVERRIDE_JOB)) build_candidate_list(flags & (ANTAG_OVERRIDE_MOB|ANTAG_OVERRIDE_JOB))
attempt_spawn()
finalize_spawn()
/datum/antagonist/proc/attempt_late_spawn(var/datum/mind/player) /datum/antagonist/proc/attempt_late_spawn(var/datum/mind/player)
if(!can_late_spawn()) if(!can_late_spawn())
@@ -88,27 +94,67 @@
add_antagonist(player,0,1,0,1,1) add_antagonist(player,0,1,0,1,1)
return return
/datum/antagonist/proc/attempt_spawn(var/ghosts_only) /datum/antagonist/proc/build_candidate_list(var/ghosts_only)
// Get the raw list of potential players. // Get the raw list of potential players.
update_current_antag_max() update_current_antag_max()
candidates = get_candidates(ghosts_only) candidates = get_candidates(ghosts_only)
//Selects players that will be spawned in the antagonist role from the potential candidates
//Selected players are added to the pending_antagonists lists.
//Attempting to spawn an antag role with ANTAG_OVERRIDE_JOB should be done before jobs are assigned,
//so that they do not occupy regular job slots. All other antag roles should be spawned after jobs are
//assigned, so that job restrictions can be respected.
/datum/antagonist/proc/attempt_spawn(var/rebuild_candidates = 1)
// Update our boundaries. // Update our boundaries.
if(!candidates.len) if(!candidates.len)
return 0 return 0
//Grab candidates randomly until we have enough. //Grab candidates randomly until we have enough.
while(candidates.len) while(candidates.len && pending_antagonists.len < cur_max)
var/datum/mind/player = pick(candidates) var/datum/mind/player = pick(candidates)
pending_antagonists |= player
candidates -= player candidates -= player
draft_antagonist(player)
return 1 return 1
/datum/antagonist/proc/draft_antagonist(var/datum/mind/player)
//Check if the player can join in this antag role, or if the player has already been given an antag role.
if(!can_become_antag(player))
log_debug("[player.key] was selected for [role_text] by lottery, but is not allowed to be that role.")
return 0
if(player.special_role)
log_debug("[player.key] was selected for [role_text] by lottery, but they already have a special role.")
return 0
if(!(flags & ANTAG_OVERRIDE_JOB) && (!player.current || istype(player.current, /mob/new_player)))
log_debug("[player.key] was selected for [role_text] by lottery, but they have not joined the game.")
return 0
pending_antagonists |= player
log_debug("[player.key] has been selected for [role_text] by lottery.")
//Ensure that antags with ANTAG_OVERRIDE_JOB do not occupy job slots.
if(flags & ANTAG_OVERRIDE_JOB)
player.assigned_role = role_text
//Ensure that a player cannot be drafted for multiple antag roles, taking up slots for antag roles that they will not fill.
player.special_role = role_text
return 1
//Spawns all pending_antagonists. This is done separately from attempt_spawn in case the game mode setup fails.
/datum/antagonist/proc/finalize_spawn() /datum/antagonist/proc/finalize_spawn()
if(!pending_antagonists || !pending_antagonists.len) if(!pending_antagonists)
return return
for(var/datum/mind/player in pending_antagonists) for(var/datum/mind/player in pending_antagonists)
if(can_become_antag(player) && !player.special_role) pending_antagonists -= player
add_antagonist(player,0,0,1) add_antagonist(player,0,0,1)
pending_antagonists.Cut()
//Resets all pending_antagonists, clearing their special_role (and assigned_role if ANTAG_OVERRIDE_JOB is set)
/datum/antagonist/proc/reset()
for(var/datum/mind/player in pending_antagonists)
if(flags & ANTAG_OVERRIDE_JOB)
player.assigned_role = null
player.special_role = null
pending_antagonists.Cut()

View File

@@ -9,6 +9,8 @@
return 0 return 0
current_antagonists |= player current_antagonists |= player
//do this again, just in case
if(flags & ANTAG_OVERRIDE_JOB) if(flags & ANTAG_OVERRIDE_JOB)
player.assigned_role = role_text player.assigned_role = role_text
player.special_role = role_text player.special_role = role_text

View File

@@ -34,15 +34,20 @@
var/obj/item/weapon/card/id/W = new id_type(player) var/obj/item/weapon/card/id/W = new id_type(player)
if(!W) return if(!W) return
W.name = "[player.real_name]'s ID Card"
W.access |= default_access W.access |= default_access
W.assignment = "[assignment]" W.assignment = "[assignment]"
W.registered_name = player.real_name player.set_id_info(W)
if(equip) player.equip_to_slot_or_del(W, slot_wear_id) if(equip) player.equip_to_slot_or_del(W, slot_wear_id)
return W return W
/datum/antagonist/proc/create_radio(var/freq, var/mob/living/carbon/human/player) /datum/antagonist/proc/create_radio(var/freq, var/mob/living/carbon/human/player)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(player) var/obj/item/device/radio/R
if(freq == SYND_FREQ)
R = new/obj/item/device/radio/headset/syndicate(player)
else
R = new/obj/item/device/radio/headset(player)
R.set_frequency(freq) R.set_frequency(freq)
player.equip_to_slot_or_del(R, slot_l_ear) player.equip_to_slot_or_del(R, slot_l_ear)
return R return R
@@ -80,7 +85,7 @@
code_owner.store_memory("<B>Nuclear Bomb Code</B>: [code]", 0, 0) code_owner.store_memory("<B>Nuclear Bomb Code</B>: [code]", 0, 0)
code_owner.current << "The nuclear authorization code is: <B>[code]</B>" code_owner.current << "The nuclear authorization code is: <B>[code]</B>"
else else
world << "<span class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>" message_admins("<span class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>")
return return
spawned_nuke = code spawned_nuke = code
@@ -113,6 +118,7 @@
if (newname) if (newname)
player.real_name = newname player.real_name = newname
player.name = player.real_name player.name = player.real_name
player.dna.real_name = newname
if(player.mind) player.mind.name = player.name if(player.mind) player.mind.name = player.name
// Update any ID cards. // Update any ID cards.
update_access(player) update_access(player)

View File

@@ -2,9 +2,9 @@
if(player.current && jobban_isbanned(player.current, bantype)) if(player.current && jobban_isbanned(player.current, bantype))
return 0 return 0
if(!ignore_role) if(!ignore_role)
if(player.assigned_role in protected_jobs) if(player.assigned_role in restricted_jobs)
return 0 return 0
if(config.protect_roles_from_antagonist && (player.assigned_role in restricted_jobs)) if(config.protect_roles_from_antagonist && (player.assigned_role in protected_jobs))
return 0 return 0
return 1 return 1

View File

@@ -8,7 +8,7 @@
/datum/antagonist/proc/create_objectives(var/datum/mind/player) /datum/antagonist/proc/create_objectives(var/datum/mind/player)
if(config.objectives_disabled) if(config.objectives_disabled)
return 0 return 0
if(create_global_objectives()) if(create_global_objectives() || global_objectives.len)
player.objectives |= global_objectives player.objectives |= global_objectives
return 1 return 1

View File

@@ -7,8 +7,8 @@
for(var/datum/mind/P in current_antagonists) for(var/datum/mind/P in current_antagonists)
text += print_player_full(P) text += print_player_full(P)
text += get_special_objective_text(P) text += get_special_objective_text(P)
var/failed
if(!global_objectives.len && P.objectives && P.objectives.len) if(!global_objectives.len && P.objectives && P.objectives.len)
var/failed
var/num = 1 var/num = 1
for(var/datum/objective/O in P.objectives) for(var/datum/objective/O in P.objectives)
text += print_objective(O, num) text += print_objective(O, num)
@@ -20,8 +20,6 @@
feedback_add_details(feedback_tag,"[O.type]|FAIL") feedback_add_details(feedback_tag,"[O.type]|FAIL")
failed = 1 failed = 1
num++ num++
if(!config.objectives_disabled)
if(failed) if(failed)
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>" text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
else else

View File

@@ -19,8 +19,7 @@
/datum/antagonist/proc/update_access(var/mob/living/player) /datum/antagonist/proc/update_access(var/mob/living/player)
for(var/obj/item/weapon/card/id/id in player.contents) for(var/obj/item/weapon/card/id/id in player.contents)
id.name = "[player.real_name]'s ID Card" player.set_id_info(id)
id.registered_name = player.real_name
/datum/antagonist/proc/update_all_icons() /datum/antagonist/proc/update_all_icons()
if(!antag_indicator) if(!antag_indicator)

View File

@@ -5,7 +5,8 @@ var/datum/antagonist/deathsquad/mercenary/commandos
landmark_id = "Syndicate-Commando" landmark_id = "Syndicate-Commando"
role_text = "Syndicate Commando" role_text = "Syndicate Commando"
role_text_plural = "Commandos" role_text_plural = "Commandos"
welcome_text = "You are in the employ of a criminal syndicate hostile to NanoTrasen." welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests."
id_type = /obj/item/weapon/card/id/centcom/ERT
/datum/antagonist/deathsquad/mercenary/New() /datum/antagonist/deathsquad/mercenary/New()
..(1) ..(1)
@@ -24,7 +25,6 @@ var/datum/antagonist/deathsquad/mercenary/commandos
player.equip_to_slot_or_del(new /obj/item/weapon/rig/merc(player), slot_back) player.equip_to_slot_or_del(new /obj/item/weapon/rig/merc(player), slot_back)
player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(player), slot_r_hand) player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(player), slot_r_hand)
var/obj/item/weapon/card/id/id = create_id("Commando", player) create_id("Commando", player)
id.access |= get_all_station_access() create_radio(SYND_FREQ, player)
id.icon_state = "centcom" return 1
create_radio(SYND_FREQ, player)

View File

@@ -5,7 +5,7 @@ var/datum/antagonist/deathsquad/deathsquad
role_type = BE_OPERATIVE role_type = BE_OPERATIVE
role_text = "Death Commando" role_text = "Death Commando"
role_text_plural = "Death Commandos" role_text_plural = "Death Commandos"
welcome_text = "You work in the service of Central Command Asset Protection, answering directly to the Board of Directors." welcome_text = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors."
landmark_id = "Commando" landmark_id = "Commando"
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER
max_antags = 4 max_antags = 4

View File

@@ -6,11 +6,12 @@ var/datum/antagonist/ert/ert
role_type = BE_OPERATIVE role_type = BE_OPERATIVE
role_text = "Emergency Responder" role_text = "Emergency Responder"
role_text_plural = "Emergency Responders" role_text_plural = "Emergency Responders"
welcome_text = "As member of the Emergency Response Team, you answer only to your leader and CentComm officials." welcome_text = "As member of the Emergency Response Team, you answer only to your leader and company officials."
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to CentComm, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however." leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however."
max_antags = 5 max_antags = 5
max_antags_round = 5 // ERT mode? max_antags_round = 5 // ERT mode?
landmark_id = "Response Team" landmark_id = "Response Team"
id_type = /obj/item/weapon/card/id/centcom/ERT
flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_CHOOSE_NAME flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_CHOOSE_NAME
@@ -25,7 +26,7 @@ var/datum/antagonist/ert/ert
/datum/antagonist/ert/greet(var/datum/mind/player) /datum/antagonist/ert/greet(var/datum/mind/player)
if(!..()) if(!..())
return return
player.current << "The Emergency Response Team works for Asset Protection; your job is to protect NanoTrasen's ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem." player.current << "The Emergency Response Team works for Asset Protection; your job is to protect [company_name]'s ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem."
player.current << "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready." player.current << "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready."
/datum/antagonist/ert/equip(var/mob/living/carbon/human/player) /datum/antagonist/ert/equip(var/mob/living/carbon/human/player)
@@ -36,10 +37,6 @@ var/datum/antagonist/ert/ert
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes) player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves) player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses) player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
var/obj/item/weapon/card/id/centcom/ERT/W = new(src) create_id(role_text, player)
W.registered_name = player.real_name
W.name = "[player.real_name]'s ID Card ([W.assignment])"
player.equip_to_slot_or_del(W, slot_wear_id)
return 1 return 1

View File

@@ -124,7 +124,7 @@ var/datum/antagonist/ninja/ninjas
player << "<span class='danger'>You forgot to turn on your internals! Quickly, toggle the valve!</span>" player << "<span class='danger'>You forgot to turn on your internals! Quickly, toggle the valve!</span>"
/datum/antagonist/ninja/proc/generate_ninja_directive(side) /datum/antagonist/ninja/proc/generate_ninja_directive(side)
var/directive = "[side=="face"?"Nanotrasen":"A criminal syndicate"] is your employer. "//Let them know which side they're on. var/directive = "[side=="face"?"[company_name]":"A criminal syndicate"] is your employer. "//Let them know which side they're on.
switch(rand(1,19)) switch(rand(1,19))
if(1) if(1)
directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible." directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible."
@@ -135,7 +135,7 @@ var/datum/antagonist/ninja/ninjas
if(4) if(4)
directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate witnesses at your discretion." directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate witnesses at your discretion."
if(5) if(5)
directive += "We are currently negotiating with NanoTrasen Central Command. Prioritize saving human lives over ending them." directive += "We are currently negotiating with [company_name] [boss_name]. Prioritize saving human lives over ending them."
if(6) if(6)
directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter." directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
if(7) if(7)
@@ -143,7 +143,7 @@ var/datum/antagonist/ninja/ninjas
if(8) if(8)
directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter." directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
if(9) if(9)
directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation." directive += "A free agent has proposed a lucrative business deal. Implicate [company_name] involvement in the operation."
if(10) if(10)
directive += "Our reputation is on the line. Harm as few civilians and innocents as possible." directive += "Our reputation is on the line. Harm as few civilians and innocents as possible."
if(11) if(11)
@@ -151,14 +151,14 @@ var/datum/antagonist/ninja/ninjas
if(12) if(12)
directive += "We are currently negotiating with a mercenary leader. Disguise assassinations as suicide or other natural causes." directive += "We are currently negotiating with a mercenary leader. Disguise assassinations as suicide or other natural causes."
if(13) if(13)
directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff." directive += "Some disgruntled [company_name] employees have been supportive of our operations. Be wary of any mistreatment by command staff."
if(14) if(14)
var/xenorace = pick("Unathi","Tajara", "Skrell") var/xenorace = pick("Unathi","Tajara", "Skrell")
directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible." directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible."
if(15) if(15)
directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false." directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false."
if(16) if(16)
directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine NanoTrasen prosthetics in a bad light." directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine [company_name] prosthetics in a bad light."
if(17) if(17)
directive += "The Spider Clan has recently begun recruiting outsiders. Consider suitable candidates and assess their behavior amongst the crew." directive += "The Spider Clan has recently begun recruiting outsiders. Consider suitable candidates and assess their behavior amongst the crew."
if(18) if(18)

View File

@@ -184,7 +184,7 @@ var/datum/antagonist/raider/raiders
return 0 return 0
for(var/datum/mind/player in current_antagonists) for(var/datum/mind/player in current_antagonists)
if(!player.current || get_area(player.current) != locate(/area/shuttle/skipjack/station)) if(!player.current || get_area(player.current) != locate(/area/skipjack_station/start))
return 0 return 0
return 1 return 1
@@ -193,7 +193,7 @@ var/datum/antagonist/raider/raiders
if(!..()) if(!..())
return 0 return 0
if(player.species && player.species.name == "Vox") if(player.species && player.species.get_bodytype() == "Vox")
equip_vox(player) equip_vox(player)
else else
var/new_shoes = pick(raider_shoes) var/new_shoes = pick(raider_shoes)

View File

@@ -96,7 +96,7 @@ var/datum/antagonist/wizard/wizards
world << "<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!</font></span>" world << "<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!</font></span>"
//To batch-remove wizard spells. Linked to mind.dm. //To batch-remove wizard spells. Linked to mind.dm.
/mob/proc/spellremove(var/mob/M as mob) /mob/proc/spellremove()
for(var/spell/spell_to_remove in src.spell_list) for(var/spell/spell_to_remove in src.spell_list)
remove_spell(spell_to_remove) remove_spell(spell_to_remove)

View File

@@ -104,9 +104,9 @@ var/datum/antagonist/cultist/cult
player.current.visible_message("<FONT size = 3>[player.current] looks like they just reverted to their old faith!</FONT>") player.current.visible_message("<FONT size = 3>[player.current] looks like they just reverted to their old faith!</FONT>")
/datum/antagonist/cultist/add_antagonist(var/datum/mind/player) /datum/antagonist/cultist/add_antagonist(var/datum/mind/player)
if(!..()) . = ..()
return if(.)
player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back." player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back."
/datum/antagonist/cultist/can_become_antag(var/datum/mind/player) /datum/antagonist/cultist/can_become_antag(var/datum/mind/player)
if(!..()) if(!..())

View File

@@ -135,10 +135,10 @@ datum/antagonist/revolutionary/finalize(var/datum/mind/target)
world << text world << text
// This is a total redefine because headrevs are greeted differently to subrevs. // This is a total redefine because headrevs are greeted differently to subrevs.
/datum/antagonist/revolutionary/add_antagonist(var/datum/mind/player) /datum/antagonist/revolutionary/add_antagonist(var/datum/mind/player, var/ignore_role)
if((player in current_antagonists) || (player in head_revolutionaries)) if((player in current_antagonists) || (player in head_revolutionaries))
return 0 return 0
if(!can_become_antag(player)) if(!can_become_antag(player, ignore_role))
return 0 return 0
current_antagonists |= player current_antagonists |= player
player.current << "<span class='danger'><font size=3>You are a Revolutionary!</font></span>" player.current << "<span class='danger'><font size=3>You are a Revolutionary!</font></span>"
@@ -168,11 +168,6 @@ datum/antagonist/revolutionary/finalize(var/datum/mind/target)
if(show_message) if(show_message)
player.current.visible_message("[player.current] looks like they just remembered their real allegiance!") player.current.visible_message("[player.current] looks like they just remembered their real allegiance!")
/datum/antagonist/revolutionary/can_become_antag(var/datum/mind/player)
return ..() && istype(player) && \
istype(player.current, /mob/living/carbon/human) && \
!(player.assigned_role in command_positions)
// Used by RP-rev. // Used by RP-rev.
/mob/living/carbon/human/proc/convert_to_rev(mob/M as mob in oview(src)) /mob/living/carbon/human/proc/convert_to_rev(mob/M as mob in oview(src))
set name = "Convert Bourgeoise" set name = "Convert Bourgeoise"

View File

@@ -6,12 +6,13 @@ var/datum/antagonist/rogue_ai/malf
role_text = "Rampant AI" role_text = "Rampant AI"
role_text_plural = "Rampant AIs" role_text_plural = "Rampant AIs"
mob_path = /mob/living/silicon/ai mob_path = /mob/living/silicon/ai
landmark_id = "AI"
welcome_text = "You are malfunctioning! You do not have to follow any laws." welcome_text = "You are malfunctioning! You do not have to follow any laws."
victory_text = "The AI has taken control of all of the station's systems." victory_text = "The AI has taken control of all of the station's systems."
loss_text = "The AI has been shut down!" loss_text = "The AI has been shut down!"
flags = ANTAG_VOTABLE | ANTAG_RANDSPAWN //Randspawn needed otherwise it won't start at all. flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME
max_antags = 1 max_antags = 1
max_antags_round = 3 max_antags_round = 1
/datum/antagonist/rogue_ai/New() /datum/antagonist/rogue_ai/New()
@@ -22,7 +23,7 @@ var/datum/antagonist/rogue_ai/malf
/datum/antagonist/rogue_ai/get_candidates() /datum/antagonist/rogue_ai/get_candidates()
..() ..()
for(var/datum/mind/player in candidates) for(var/datum/mind/player in candidates)
if(player.assigned_role != "AI") if(player.assigned_role && player.assigned_role != "AI")
candidates -= player candidates -= player
if(!candidates.len) if(!candidates.len)
return list() return list()
@@ -75,3 +76,26 @@ var/datum/antagonist/rogue_ai/malf
malf << "For basic information about your abilities use command display-help" malf << "For basic information about your abilities use command display-help"
malf << "You may choose one special hardware piece to help you. This cannot be undone." malf << "You may choose one special hardware piece to help you. This cannot be undone."
malf << "Good luck!" malf << "Good luck!"
/datum/antagonist/rogue_ai/update_antag_mob(var/datum/mind/player, var/preserve_appearance)
// Get the mob.
if((flags & ANTAG_OVERRIDE_MOB) && (!player.current || (mob_path && !istype(player.current, mob_path))))
var/mob/holder = player.current
player.current = new mob_path(get_turf(player.current), null, null, 1)
player.transfer_to(player.current)
if(holder) qdel(holder)
player.original = player.current
return player.current
/datum/antagonist/rogue_ai/set_antag_name(var/mob/living/silicon/player)
if(!istype(player))
testing("rogue_ai set_antag_name called on non-silicon mob [player]!")
return
// Choose a name, if any.
var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
if (newname)
player.SetName(newname)
if(player.mind) player.mind.name = player.name

View File

@@ -52,7 +52,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/air_doors_activated = 0 var/air_doors_activated = 0
var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
var/list/forced_ambience = null var/list/forced_ambience = null
var/sound_env = 2 //reverb preset for sounds played in this area, see sound datum reference for more var/sound_env = STANDARD_STATION
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ /*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ /*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
var/list/teleportlocs = list() var/list/teleportlocs = list()
@@ -98,6 +98,7 @@ var/list/ghostteleportlocs = list()
icon_state = "space" icon_state = "space"
requires_power = 1 requires_power = 1
always_unpowered = 1 always_unpowered = 1
lighting_use_dynamic = 0
power_light = 0 power_light = 0
power_equip = 0 power_equip = 0
power_environ = 0 power_environ = 0
@@ -142,6 +143,7 @@ area/space/atmosalert()
/area/shuttle /area/shuttle
requires_power = 0 requires_power = 0
sound_env = SMALL_ENCLOSED
/area/shuttle/arrival /area/shuttle/arrival
name = "\improper Arrival Shuttle" name = "\improper Arrival Shuttle"
@@ -319,11 +321,6 @@ area/space/atmosalert()
/area/shuttle/research/outpost /area/shuttle/research/outpost
icon_state = "shuttle" icon_state = "shuttle"
/area/shuttle/skipjack/station
name = "\improper Skipjack"
icon_state = "yellow"
requires_power = 0
/area/airtunnel1/ // referenced in airtunnel.dm:759 /area/airtunnel1/ // referenced in airtunnel.dm:759
/area/dummy/ // Referenced in engine.dm:261 /area/dummy/ // Referenced in engine.dm:261
@@ -402,15 +399,18 @@ area/space/atmosalert()
name = "\improper Moon" name = "\improper Moon"
icon_state = "asteroid" icon_state = "asteroid"
requires_power = 0 requires_power = 0
sound_env = ASTEROID
/area/asteroid/cave // -- TLE /area/asteroid/cave // -- TLE
name = "\improper Moon - Underground" name = "\improper Moon - Underground"
icon_state = "cave" icon_state = "cave"
requires_power = 0 requires_power = 0
sound_env = ASTEROID
/area/asteroid/artifactroom /area/asteroid/artifactroom
name = "\improper Moon - Artifact" name = "\improper Moon - Artifact"
icon_state = "cave" icon_state = "cave"
sound_env = SMALL_ENCLOSED
@@ -436,6 +436,7 @@ area/space/atmosalert()
icon_state = "thunder" icon_state = "thunder"
requires_power = 0 requires_power = 0
lighting_use_dynamic = 0 lighting_use_dynamic = 0
sound_env = ARENA
/area/tdome/tdome1 /area/tdome/tdome1
name = "\improper Thunderdome (Team 1)" name = "\improper Thunderdome (Team 1)"
@@ -516,8 +517,16 @@ area/space/atmosalert()
requires_power = 0 requires_power = 0
lighting_use_dynamic = 0 lighting_use_dynamic = 0
/area/skipjack_station/transit /area/skipjack_station
name = "\improper Skipjack"
icon_state = "yellow"
requires_power = 0
/area/skipjack_station/start
name = "\improper Skipjack"
icon_state = "yellow"
/area/skipjack_station/transit
name = "\improper hyperspace" name = "\improper hyperspace"
icon_state = "shuttle" icon_state = "shuttle"
@@ -632,6 +641,7 @@ area/space/atmosalert()
/area/maintenance /area/maintenance
flags = RAD_SHIELDED flags = RAD_SHIELDED
sound_env = TUNNEL_ENCLOSED
/area/maintenance/aft /area/maintenance/aft
name = "Aft Maintenance" name = "Aft Maintenance"
@@ -766,6 +776,7 @@ area/space/atmosalert()
/area/maintenance/substation /area/maintenance/substation
name = "Substation" name = "Substation"
icon_state = "substation" icon_state = "substation"
sound_env = SMALL_ENCLOSED
/area/maintenance/substation/engineering // Probably will be connected to engineering SMES room, as wires cannot be crossed properly without them sharing powernets. /area/maintenance/substation/engineering // Probably will be connected to engineering SMES room, as wires cannot be crossed properly without them sharing powernets.
name = "Engineering Substation" name = "Engineering Substation"
@@ -798,7 +809,7 @@ area/space/atmosalert()
//Hallway //Hallway
/area/hallway/primary/ /area/hallway/primary/
sound_env = 12 //hallway sound_env = LARGE_ENCLOSED
/area/hallway/primary/fore /area/hallway/primary/fore
name = "\improper Fore Primary Hallway" name = "\improper Fore Primary Hallway"
@@ -863,10 +874,12 @@ area/space/atmosalert()
name = "\improper Heads of Staff Meeting Room" name = "\improper Heads of Staff Meeting Room"
icon_state = "bridge" icon_state = "bridge"
music = null music = null
sound_env = MEDIUM_SOFTFLOOR
/area/crew_quarters/captain /area/crew_quarters/captain
name = "\improper Command - Captain's Office" name = "\improper Command - Captain's Office"
icon_state = "captain" icon_state = "captain"
sound_env = MEDIUM_SOFTFLOOR
/area/crew_quarters/heads/hop /area/crew_quarters/heads/hop
name = "\improper Command - HoP's Office" name = "\improper Command - HoP's Office"
@@ -901,7 +914,7 @@ area/space/atmosalert()
icon_state = "tcomsatcham" icon_state = "tcomsatcham"
/area/server /area/server
name = "\improper Messaging Server Room" name = "\improper Research Server Room"
icon_state = "server" icon_state = "server"
//Crew //Crew
@@ -914,6 +927,7 @@ area/space/atmosalert()
/area/crew_quarters/toilet /area/crew_quarters/toilet
name = "\improper Dormitory Toilets" name = "\improper Dormitory Toilets"
icon_state = "toilet" icon_state = "toilet"
sound_env = SMALL_ENCLOSED
/area/crew_quarters/sleep /area/crew_quarters/sleep
name = "\improper Dormitories" name = "\improper Dormitories"
@@ -922,10 +936,12 @@ area/space/atmosalert()
/area/crew_quarters/sleep/engi_wash /area/crew_quarters/sleep/engi_wash
name = "\improper Engineering Washroom" name = "\improper Engineering Washroom"
icon_state = "toilet" icon_state = "toilet"
sound_env = SMALL_ENCLOSED
/area/crew_quarters/sleep/bedrooms /area/crew_quarters/sleep/bedrooms
name = "\improper Dormitory Bedroom One" name = "\improper Dormitory Bedroom One"
icon_state = "Sleep" icon_state = "Sleep"
sound_env = SMALL_SOFTFLOOR
/area/crew_quarters/sleep/cryo /area/crew_quarters/sleep/cryo
name = "\improper Cryogenic Storage" name = "\improper Cryogenic Storage"
@@ -938,6 +954,7 @@ area/space/atmosalert()
/area/crew_quarters/sleep_male/toilet_male /area/crew_quarters/sleep_male/toilet_male
name = "\improper Male Toilets" name = "\improper Male Toilets"
icon_state = "toilet" icon_state = "toilet"
sound_env = SMALL_ENCLOSED
/area/crew_quarters/sleep_female /area/crew_quarters/sleep_female
name = "\improper Female Dorm" name = "\improper Female Dorm"
@@ -946,6 +963,7 @@ area/space/atmosalert()
/area/crew_quarters/sleep_female/toilet_female /area/crew_quarters/sleep_female/toilet_female
name = "\improper Female Toilets" name = "\improper Female Toilets"
icon_state = "toilet" icon_state = "toilet"
sound_env = SMALL_ENCLOSED
/area/crew_quarters/locker /area/crew_quarters/locker
name = "\improper Locker Room" name = "\improper Locker Room"
@@ -954,6 +972,7 @@ area/space/atmosalert()
/area/crew_quarters/locker/locker_toilet /area/crew_quarters/locker/locker_toilet
name = "\improper Locker Toilets" name = "\improper Locker Toilets"
icon_state = "toilet" icon_state = "toilet"
sound_env = SMALL_ENCLOSED
/area/crew_quarters/fitness /area/crew_quarters/fitness
name = "\improper Fitness Room" name = "\improper Fitness Room"
@@ -970,19 +989,23 @@ area/space/atmosalert()
/area/crew_quarters/bar /area/crew_quarters/bar
name = "\improper Bar" name = "\improper Bar"
icon_state = "bar" icon_state = "bar"
sound_env = LARGE_SOFTFLOOR
/area/crew_quarters/theatre /area/crew_quarters/theatre
name = "\improper Theatre" name = "\improper Theatre"
icon_state = "Theatre" icon_state = "Theatre"
sound_env = LARGE_SOFTFLOOR
/area/library /area/library
name = "\improper Library" name = "\improper Library"
icon_state = "library" icon_state = "library"
sound_env = LARGE_SOFTFLOOR
/area/chapel/main /area/chapel/main
name = "\improper Chapel" name = "\improper Chapel"
icon_state = "chapel" icon_state = "chapel"
ambience = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg') ambience = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg')
sound_env = LARGE_ENCLOSED
/area/chapel/office /area/chapel/office
name = "\improper Chapel Office" name = "\improper Chapel Office"
@@ -999,6 +1022,7 @@ area/space/atmosalert()
name = "\improper Holodeck" name = "\improper Holodeck"
icon_state = "Holodeck" icon_state = "Holodeck"
lighting_use_dynamic = 0 lighting_use_dynamic = 0
sound_env = LARGE_ENCLOSED
/area/holodeck/alphadeck /area/holodeck/alphadeck
name = "\improper Holodeck Alpha" name = "\improper Holodeck Alpha"
@@ -1008,21 +1032,27 @@ area/space/atmosalert()
/area/holodeck/source_emptycourt /area/holodeck/source_emptycourt
name = "\improper Holodeck - Empty Court" name = "\improper Holodeck - Empty Court"
sound_env = ARENA
/area/holodeck/source_boxingcourt /area/holodeck/source_boxingcourt
name = "\improper Holodeck - Boxing Court" name = "\improper Holodeck - Boxing Court"
sound_env = ARENA
/area/holodeck/source_basketball /area/holodeck/source_basketball
name = "\improper Holodeck - Basketball Court" name = "\improper Holodeck - Basketball Court"
sound_env = ARENA
/area/holodeck/source_thunderdomecourt /area/holodeck/source_thunderdomecourt
name = "\improper Holodeck - Thunderdome Court" name = "\improper Holodeck - Thunderdome Court"
sound_env = ARENA
/area/holodeck/source_courtroom /area/holodeck/source_courtroom
name = "\improper Holodeck - Courtroom" name = "\improper Holodeck - Courtroom"
sound_env = AUDITORIUM
/area/holodeck/source_beach /area/holodeck/source_beach
name = "\improper Holodeck - Beach" name = "\improper Holodeck - Beach"
sound_env = PLAIN
/area/holodeck/source_burntest /area/holodeck/source_burntest
name = "\improper Holodeck - Atmospheric Burn Test" name = "\improper Holodeck - Atmospheric Burn Test"
@@ -1032,22 +1062,28 @@ area/space/atmosalert()
/area/holodeck/source_meetinghall /area/holodeck/source_meetinghall
name = "\improper Holodeck - Meeting Hall" name = "\improper Holodeck - Meeting Hall"
sound_env = AUDITORIUM
/area/holodeck/source_theatre /area/holodeck/source_theatre
name = "\improper Holodeck - Theatre" name = "\improper Holodeck - Theatre"
sound_env = CONCERT_HALL
/area/holodeck/source_picnicarea /area/holodeck/source_picnicarea
name = "\improper Holodeck - Picnic Area" name = "\improper Holodeck - Picnic Area"
sound_env = PLAIN
/area/holodeck/source_snowfield /area/holodeck/source_snowfield
name = "\improper Holodeck - Snow Field" name = "\improper Holodeck - Snow Field"
sound_env = FOREST
/area/holodeck/source_desert /area/holodeck/source_desert
name = "\improper Holodeck - Desert" name = "\improper Holodeck - Desert"
sound_env = PLAIN
/area/holodeck/source_space /area/holodeck/source_space
name = "\improper Holodeck - Space" name = "\improper Holodeck - Space"
has_gravity = 0 has_gravity = 0
sound_env = SPACE
//Engineering //Engineering
@@ -1059,26 +1095,32 @@ area/space/atmosalert()
/area/engineering/atmos /area/engineering/atmos
name = "\improper Atmospherics" name = "\improper Atmospherics"
icon_state = "atmos" icon_state = "atmos"
sound_env = LARGE_ENCLOSED
/area/engineering/atmos/monitoring /area/engineering/atmos/monitoring
name = "\improper Atmospherics Monitoring Room" name = "\improper Atmospherics Monitoring Room"
icon_state = "atmos_monitoring" icon_state = "atmos_monitoring"
sound_env = STANDARD_STATION
/area/engineering/atmos/storage /area/engineering/atmos/storage
name = "\improper Atmospherics Storage" name = "\improper Atmospherics Storage"
icon_state = "atmos_storage" icon_state = "atmos_storage"
sound_env = SMALL_ENCLOSED
/area/engineering/drone_fabrication /area/engineering/drone_fabrication
name = "\improper Engineering Drone Fabrication" name = "\improper Engineering Drone Fabrication"
icon_state = "drone_fab" icon_state = "drone_fab"
sound_env = SMALL_ENCLOSED
/area/engineering/engine_smes /area/engineering/engine_smes
name = "\improper Engineering SMES" name = "\improper Engineering SMES"
icon_state = "engine_smes" icon_state = "engine_smes"
sound_env = SMALL_ENCLOSED
/area/engineering/engine_room /area/engineering/engine_room
name = "\improper Engine Room" name = "\improper Engine Room"
icon_state = "engine" icon_state = "engine"
sound_env = LARGE_ENCLOSED
/area/engineering/engine_airlock /area/engineering/engine_airlock
name = "\improper Engine Room Airlock" name = "\improper Engine Room Airlock"
@@ -1107,6 +1149,7 @@ area/space/atmosalert()
/area/engineering/break_room /area/engineering/break_room
name = "\improper Engineering Break Room" name = "\improper Engineering Break Room"
icon_state = "engineering_break" icon_state = "engineering_break"
sound_env = MEDIUM_SOFTFLOOR
/area/engineering/engine_eva /area/engineering/engine_eva
name = "\improper Engine EVA" name = "\improper Engine EVA"
@@ -1156,22 +1199,27 @@ area/space/atmosalert()
/area/maintenance/auxsolarport /area/maintenance/auxsolarport
name = "Solar Maintenance - Fore Port" name = "Solar Maintenance - Fore Port"
icon_state = "SolarcontrolP" icon_state = "SolarcontrolP"
sound_env = SMALL_ENCLOSED
/area/maintenance/starboardsolar /area/maintenance/starboardsolar
name = "Solar Maintenance - Aft Starboard" name = "Solar Maintenance - Aft Starboard"
icon_state = "SolarcontrolS" icon_state = "SolarcontrolS"
sound_env = SMALL_ENCLOSED
/area/maintenance/portsolar /area/maintenance/portsolar
name = "Solar Maintenance - Aft Port" name = "Solar Maintenance - Aft Port"
icon_state = "SolarcontrolP" icon_state = "SolarcontrolP"
sound_env = SMALL_ENCLOSED
/area/maintenance/auxsolarstarboard /area/maintenance/auxsolarstarboard
name = "Solar Maintenance - Fore Starboard" name = "Solar Maintenance - Fore Starboard"
icon_state = "SolarcontrolS" icon_state = "SolarcontrolS"
sound_env = SMALL_ENCLOSED
/area/maintenance/foresolar /area/maintenance/foresolar
name = "Solar Maintenance - Fore" name = "Solar Maintenance - Fore"
icon_state = "SolarcontrolA" icon_state = "SolarcontrolA"
sound_env = SMALL_ENCLOSED
/area/assembly/chargebay /area/assembly/chargebay
name = "\improper Mech Bay" name = "\improper Mech Bay"
@@ -1383,6 +1431,7 @@ area/space/atmosalert()
/area/security/detectives_office /area/security/detectives_office
name = "\improper Security - Forensic Office" name = "\improper Security - Forensic Office"
icon_state = "detective" icon_state = "detective"
sound_env = MEDIUM_SOFTFLOOR
/area/security/range /area/security/range
name = "\improper Security - Firing Range" name = "\improper Security - Firing Range"
@@ -1457,6 +1506,7 @@ area/space/atmosalert()
/area/quartermaster/storage /area/quartermaster/storage
name = "\improper Cargo Bay" name = "\improper Cargo Bay"
icon_state = "quartstorage" icon_state = "quartstorage"
sound_env = LARGE_ENCLOSED
/area/quartermaster/qm /area/quartermaster/qm
name = "\improper Cargo - Quartermaster's Office" name = "\improper Cargo - Quartermaster's Office"
@@ -1807,10 +1857,12 @@ area/space/atmosalert()
name = "AI Upload Access" name = "AI Upload Access"
icon_state = "ai_foyer" icon_state = "ai_foyer"
ambience = list('sound/ambience/ambimalf.ogg') ambience = list('sound/ambience/ambimalf.ogg')
sound_env = SMALL_ENCLOSED
/area/turret_protected/ai_server_room /area/turret_protected/ai_server_room
name = "AI Server Room" name = "Messaging Server Room"
icon_state = "ai_server" icon_state = "ai_server"
sound_env = SMALL_ENCLOSED
/area/turret_protected/ai /area/turret_protected/ai
name = "\improper AI Chamber" name = "\improper AI Chamber"
@@ -1820,6 +1872,7 @@ area/space/atmosalert()
/area/turret_protected/ai_cyborg_station /area/turret_protected/ai_cyborg_station
name = "\improper Cyborg Station" name = "\improper Cyborg Station"
icon_state = "ai_cyborg" icon_state = "ai_cyborg"
sound_env = SMALL_ENCLOSED
/area/turret_protected/aisat /area/turret_protected/aisat
name = "\improper AI Satellite" name = "\improper AI Satellite"

View File

@@ -14,13 +14,17 @@
all_areas += src all_areas += src
if(!requires_power) if(!requires_power)
power_light = 0 //rastaf0 power_light = 0
power_equip = 0 //rastaf0 power_equip = 0
power_environ = 0 //rastaf0 power_environ = 0
..() ..()
// spawn(15) /area/proc/initialize()
if(!requires_power || !apc)
power_light = 0
power_equip = 0
power_environ = 0
power_change() // all machines set to current power level, also updates lighting icon power_change() // all machines set to current power level, also updates lighting icon
/area/proc/get_contents() /area/proc/get_contents()
@@ -63,7 +67,7 @@
for(var/obj/machinery/door/firedoor/E in all_doors) for(var/obj/machinery/door/firedoor/E in all_doors)
if(!E.blocked) if(!E.blocked)
if(E.operating) if(E.operating)
E.nextstate = CLOSED E.nextstate = FIREDOOR_CLOSED
else if(!E.density) else if(!E.density)
spawn(0) spawn(0)
E.close() E.close()
@@ -74,7 +78,7 @@
for(var/obj/machinery/door/firedoor/E in all_doors) for(var/obj/machinery/door/firedoor/E in all_doors)
if(!E.blocked) if(!E.blocked)
if(E.operating) if(E.operating)
E.nextstate = OPEN E.nextstate = FIREDOOR_OPEN
else if(E.density) else if(E.density)
spawn(0) spawn(0)
E.open() E.open()
@@ -88,7 +92,7 @@
for(var/obj/machinery/door/firedoor/D in all_doors) for(var/obj/machinery/door/firedoor/D in all_doors)
if(!D.blocked) if(!D.blocked)
if(D.operating) if(D.operating)
D.nextstate = CLOSED D.nextstate = FIREDOOR_CLOSED
else if(!D.density) else if(!D.density)
spawn() spawn()
D.close() D.close()
@@ -101,7 +105,7 @@
for(var/obj/machinery/door/firedoor/D in all_doors) for(var/obj/machinery/door/firedoor/D in all_doors)
if(!D.blocked) if(!D.blocked)
if(D.operating) if(D.operating)
D.nextstate = OPEN D.nextstate = FIREDOOR_OPEN
else if(D.density) else if(D.density)
spawn(0) spawn(0)
D.open() D.open()
@@ -133,7 +137,7 @@
for(var/obj/machinery/door/firedoor/D in src) for(var/obj/machinery/door/firedoor/D in src)
if(!D.blocked) if(!D.blocked)
if(D.operating) if(D.operating)
D.nextstate = OPEN D.nextstate = FIREDOOR_OPEN
else if(D.density) else if(D.density)
spawn(0) spawn(0)
D.open() D.open()
@@ -227,7 +231,7 @@ var/list/mob/living/forced_ambiance_list = new
var/area/oldarea = L.lastarea var/area/oldarea = L.lastarea
if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (L.m_intent == "run")) // Being ready when you change areas gives you a chance to avoid falling all together. if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (L.m_intent == "run")) // Being ready when you change areas gives you a chance to avoid falling all together.
thunk(L) thunk(L)
L.make_floating(0) L.update_floating( L.Check_Dense_Object() )
L.lastarea = newarea L.lastarea = newarea
play_ambience(L) play_ambience(L)
@@ -260,21 +264,10 @@ var/list/mob/living/forced_ambiance_list = new
/area/proc/gravitychange(var/gravitystate = 0, var/area/A) /area/proc/gravitychange(var/gravitystate = 0, var/area/A)
A.has_gravity = gravitystate A.has_gravity = gravitystate
if(gravitystate) for(var/mob/M in A)
for(var/mob/living/carbon/human/M in A) if(has_gravity)
thunk(M) thunk(M)
for(var/mob/M1 in A) M.update_floating( M.Check_Dense_Object() )
M1.make_floating(0)
else
for(var/mob/M in A)
if(M.Check_Dense_Object() && istype(src,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = src
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags & NOSLIP)) //magboots + dense_object = no floaty effect
H.make_floating(0)
else
H.make_floating(1)
else
M.make_floating(1)
/area/proc/thunk(mob) /area/proc/thunk(mob)
if(istype(get_turf(mob), /turf/space)) // Can't fall onto nothing. if(istype(get_turf(mob), /turf/space)) // Can't fall onto nothing.
@@ -282,7 +275,7 @@ var/list/mob/living/forced_ambiance_list = new
if(istype(mob,/mob/living/carbon/human/)) if(istype(mob,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = mob var/mob/living/carbon/human/H = mob
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags & NOSLIP)) if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP))
return return
if(H.m_intent == "run") if(H.m_intent == "run")

View File

@@ -3,7 +3,7 @@
/area/mine /area/mine
icon_state = "mining" icon_state = "mining"
music = 'sound/ambience/song_game.ogg' music = 'sound/ambience/song_game.ogg'
sound_env = 5 //stoneroom sound_env = ASTEROID
/area/mine/explored /area/mine/explored
name = "Mine" name = "Mine"

View File

@@ -24,7 +24,7 @@ proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor , va
if(!wall) if(!wall)
wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall,/obj/effect/alien/resin) wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall,/obj/effect/alien/resin)
if(!floor) if(!floor)
floor = pick(/turf/simulated/floor,/turf/simulated/floor/engine) floor = pick(/turf/simulated/floor,/turf/simulated/floor/tiled,/turf/simulated/floor/reinforced)
for(var/x = 0,x<x_size,x++) for(var/x = 0,x<x_size,x++)
for(var/y = 0,y<y_size,y++) for(var/y = 0,y<y_size,y++)
@@ -76,9 +76,9 @@ proc/admin_spawn_room_at_pos()
wall=/obj/effect/alien/resin wall=/obj/effect/alien/resin
switch(alert("Floor type",null,"Regular floor","Reinforced floor")) switch(alert("Floor type",null,"Regular floor","Reinforced floor"))
if("Regular floor") if("Regular floor")
floor=/turf/simulated/floor floor=/turf/simulated/floor/tiled
if("Reinforced floor") if("Reinforced floor")
floor=/turf/simulated/floor/engine floor=/turf/simulated/floor/reinforced
if(x && y && z && wall && floor && x_len && y_len) if(x && y && z && wall && floor && x_len && y_len)
spawn_room(locate(x,y,z),x_len,y_len,wall,floor,clean) spawn_room(locate(x,y,z),x_len,y_len,wall,floor,clean)
return return

View File

@@ -35,7 +35,7 @@
else else
return null return null
//return flags that should be added to the viewer's sight var. //return flags that should be added to the viewer's sight var.
//Otherwise return a negative number to indicate that the view should be cancelled. //Otherwise return a negative number to indicate that the view should be cancelled.
/atom/proc/check_eye(user as mob) /atom/proc/check_eye(user as mob)
if (istype(user, /mob/living/silicon/ai)) // WHYYYY if (istype(user, /mob/living/silicon/ai)) // WHYYYY
@@ -66,6 +66,8 @@
/atom/proc/CheckExit() /atom/proc/CheckExit()
return 1 return 1
// If you want to use this, the atom must have the PROXMOVE flag, and the moving
// atom must also have the PROXMOVE flag currently to help with lag. ~ ComicIronic
/atom/proc/HasProximity(atom/movable/AM as mob|obj) /atom/proc/HasProximity(atom/movable/AM as mob|obj)
return return
@@ -213,7 +215,7 @@ its easier to just keep the beam vertical.
/atom/proc/ex_act() /atom/proc/ex_act()
return return
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source) /atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
return -1 return -1
@@ -411,7 +413,6 @@ its easier to just keep the beam vertical.
/atom/proc/clean_blood() /atom/proc/clean_blood()
if(!simulated) if(!simulated)
return return
src.color = initial(src.color) //paint
src.germ_level = 0 src.germ_level = 0
if(istype(blood_DNA, /list)) if(istype(blood_DNA, /list))
del(blood_DNA) del(blood_DNA)

View File

@@ -21,9 +21,14 @@
if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING) if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING)
initialize() initialize()
/proc/generate_debug_runtime() // Guaranteed to runtime and print a stack trace to the runtime log
var/t = 0 // BYOND won't let us do var/t = 1/0 directly, but it's fine with this.
t = 1 / t
/atom/movable/Del() /atom/movable/Del()
if(isnull(gcDestroyed) && loc) if(isnull(gcDestroyed) && loc)
testing("GC: -- [type] was deleted via del() rather than qdel() --") testing("GC: -- [type] was deleted via del() rather than qdel() --")
generate_debug_runtime() // stick a stack trace in the runtime logs
// else if(isnull(gcDestroyed)) // else if(isnull(gcDestroyed))
// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel() // testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel()
// else // else
@@ -34,6 +39,7 @@
. = ..() . = ..()
if(reagents) if(reagents)
qdel(reagents) qdel(reagents)
reagents = null
for(var/atom/movable/AM in contents) for(var/atom/movable/AM in contents)
qdel(AM) qdel(AM)
loc = null loc = null
@@ -164,7 +170,7 @@
a = get_area(src.loc) a = get_area(src.loc)
else else
var/error = dist_y/2 - dist_x var/error = dist_y/2 - dist_x
while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf)) while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0) if(error < 0)
var/atom/step = get_step(src, dx) var/atom/step = get_step(src, dx)

Some files were not shown because too many files have changed in this diff Show More