Workshop.codes
Login
Create
わぁ

OVALORANT

--- SETTINGS ---

settings {
"main": {
"Description": "VALORANT Remake: 14 Agents, Spike, Economy, Maps Selection",
"Mode Name": "VALORANT: OVERWATCH"
},
"gamemodes": {
"elimination": {
"Enabled": true,
"Score to Win": 13,
"Draw After Match Time Elapses": false
}
},
"heroes": {
"all": {
"projectilespeed%": 500, # 弾速を最大化
"damagedealt%": 100,
"health%": 100,
"ability
1cooldown%": 200,
"ability2cooldown%": 200
},
"mercy": {
"ability
1enabled": false,
"ability
2enabled": false,
"ult
enabled": false
}
}
}

--- GLOBAL VARIABLES ---

globalvar PHASE # 0:Buy, 1:Action, 2:Post-Plant
globalvar SPIKEPOS
globalvar IS
SPIKEPLANTED
globalvar ATTACKING
TEAM
globalvar SHOPCOSTRIFLE = 2900

--- PLAYER VARIABLES ---

playervar Credits
playervar IsFlashed
playervar AbilityCooldown

--- INITIALIZATION ---

rule "Global Setup":
@Event global
PHASE = 0
ATTACKING_TEAM = Team.1
disableAnnouncer()
# マップ選択のヒントをログに表示
# 推奨: Hanamura, Anubis, Lijiang

rule "Player Setup & HUD":
@Event eachPlayer

eventPlayer.Credits = 800
eventPlayer.setMoveSpeed(75)
eventPlayer.setMaxHealth(100)
eventPlayer.setReceiveHealing(0)

# HUD Display
createInWorldText(eventPlayer, "CREDITS: {0}".format(eventPlayer.Credits), updateEveryTick(eventPlayer.getEyePosition() + eventPlayer.getFacingDirection() * 2 + Vector.UP * 0.5), 1.5, Clipping.NONE, InWorldTextReeval.VISIBILITYPOSITIONAND_STRING, Color.GOLD, SpectatorVisibility.DEFAULT)

# ヒーロー制限 (ビーム系禁止)
if eventPlayer.getCurrentHero() in [Hero.MEI, Hero.SYMMETRA, Hero.ZARYA, Hero.WINSTON, Hero.MOIRA]:
eventPlayer.setPrimaryFireEnabled(false)
eventPlayer.smallMessage("BEAM HEROES ARE BANNED / ビーム系は禁止です")

--- STOPPING MECHANICS (Accuracy) ---

rule "Shooting Logic: Accuracy & Stopping":
@Event eachPlayer
@Condition eventPlayer.isFiring() == true

if eventPlayer.getSpeed() > 1.2:
# 走り撃ちペナルティ (Moving)
eventPlayer.setDamageDealt(30)
eventPlayer.startCameraShake(5, 0.1)
else:
# 静止撃ち (Standing Still)
if eventPlayer.getCurrentHero() == Hero.MERCY:
eventPlayer.setDamageDealt(160) # Classic (Weakest)
elif eventPlayer.getCurrentHero() == Hero.WIDOWMAKER:
eventPlayer.setDamageDealt(500) # Operator (Strongest)
elif eventPlayer.getCurrentHero() == Hero.CASSIDY:
eventPlayer.setDamageDealt(280) # Sheriff
else:
eventPlayer.setDamageDealt(240) # Vandal/Phantom
eventPlayer.stopCameraShake()

--- SMOKE SYSTEM (Controller Ability) ---

rule "Ability: Smoke (Interact F)":
@Event eachPlayer
@Condition eventPlayer.isHoldingButton(Button.INTERACT)
@Condition eventPlayer.AbilityCooldown <= 0
@Condition eventPlayer.getCurrentHero() in [Hero.ANA, Hero.BAPTISTE]

createEffect(getAllPlayers(), Effect.SPHERE, Color.GRAY, raycast(eventPlayer.getEyePosition(), eventPlayer.getEyePosition() + eventPlayer.getFacingDirection() * 25, null, null, false).getHitPosition(), 4.5, EffectReeval.VISIBILITYPOSITIONAND_RADIUS)
eventPlayer.AbilityCooldown = 25
smallMessage(eventPlayer, "SMOKE DEPLOYED / スモーク設置")
wait(12)
destroyEffect(getLastCreatedEntity())

--- FLASH SYSTEM (Duelist Ability) ---

rule "Ability: Flash (Ability 2 E)":
@Event eachPlayer
@Condition eventPlayer.isHoldingButton(Button.ABILITY_2)
@Condition eventPlayer.AbilityCooldown <= 0
@Condition eventPlayer.getCurrentHero() in [Hero.SOMBRA, Hero.KIRIKO]

foreach enemy in getPlayersInRadius(eventPlayer.getEyePosition() + eventPlayer.getFacingDirection() * 6, 12, getOppositeTeam(eventPlayer.getTeam()), RadiusLos.SURFACES):
if isInLos(eventPlayer, enemy, BarrierLos.PASSTHROUGHBARRIERS):
enemy.IsFlashed = 1.6
enemy.setPrimaryFireEnabled(false)

eventPlayer.AbilityCooldown = 20
smallMessage(eventPlayer, "FLASHING! / フラッシュ!")

rule "Flash Visual Processing":
@Event eachPlayer
@Condition eventPlayer.IsFlashed > 0

eventPlayer.startCameraShake(15, 0.1)
while eventPlayer.IsFlashed > 0:
eventPlayer.IsFlashed -= 0.1
wait(0.1)
eventPlayer.stopCameraShake()
eventPlayer.setPrimaryFireEnabled(true)

--- ECONOMY & SHOP SYSTEM ---

rule "Round Phase: Buy Phase (15s)":
@Event global
@Condition isGameInProgress()

PHASE = 0
bigMessage(getAllPlayers(), "BUY PHASE (15s) / 購入フェーズ")
wait(15)
PHASE = 1
bigMessage(getAllPlayers(), "ACTION PHASE / 開始!")

rule "Shop Logic: Purchase Rifle (R Key)":
@Event eachPlayer
@Condition PHASE == 0
@Condition eventPlayer.isHoldingButton(Button.RELOAD)

if eventPlayer.Credits >= SHOPCOSTRIFLE:
eventPlayer.Credits -= SHOPCOSTRIFLE
eventPlayer.setDamageDealt(350)
smallMessage(eventPlayer, "PURCHASED: RIFLE / 武器を購入しました")
else:
smallMessage(eventPlayer, "NOT ENOUGH CREDITS / クレジット不足")

rule "Kill Reward":
@Event playerDealtFinalBlow
eventPlayer.Credits += 200

--- SPIKE SYSTEM ---

rule "Spike Logic: Planting (F)":
@Event eachPlayer
@Condition eventPlayer.getTeam() == ATTACKING_TEAM
@Condition eventPlayer.isHoldingButton(Button.INTERACT)
@Condition PHASE == 1

smallMessage(eventPlayer, "PLANTING SPIKE... / 設置中...")
wait(4, WaitBehavior.ABORTWHENFALSE)
ISSPIKEPLANTED = true
SPIKEPOS = eventPlayer.getPosition()
PHASE = 2
bigMessage(getAllPlayers(), "SPIKE PLANTED / スパイク設置!")
createEffect(getAllPlayers(), Effect.SPHERE, Color.RED, SPIKE
POS, 1.2, EffectReeval.VISIBILITYPOSITIONAND_RADIUS)

rule "Spike Logic: Defusing (F)":
@Event eachPlayer
@Condition eventPlayer.getTeam() != ATTACKINGTEAM
@Condition IS
SPIKEPLANTED == true
@Condition distance(eventPlayer.getPosition(), SPIKE
POS) < 2.5
@Condition eventPlayer.isHoldingButton(Button.INTERACT)

smallMessage(eventPlayer, "DEFUSING SPIKE... / 解除中...")
wait(7, WaitBehavior.ABORTWHENFALSE)
ISSPIKEPLANTED = false
bigMessage(getAllPlayers(), "SPIKE DEFUSED / スパイク解除完了!")
declareRoundVictory(getOppositeTeam(ATTACKING_TEAM))

Workshop.codes