Skip to content

Scénářovací systém

Tato stránka popisuje jak funguje scénařovací systém vytvoření pro workshop Enak.

Python knihovna umožňuje tuto funkcionalitu je dostupná na GitHub.

Vytvoření nového scénáře

Pro vytvoření nového scénáře napište nový python skript v tomto formátu

py
from enak.Enak import *
from random import randint

building_consumptions = {
	Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
	...
}

source_productions = {
	Source.COAL: (250, 500),
	...
}

def getScript():
	script = Script(building_consumptions, source_productions)

	#script.setVerbose(True) #set script to be verbose

	...

	return script

Tento skript uložte do složky WebControl/CoreAPI/src/scenarios, samotné přidání se provede v souboru CoreAPI/src/state.py následovně:

py
from scenarios.test_scenario import getScript as getTestScript

available_script_generators: Dict[str, Callable[[], Script]] = {
    "testovací": getTestScript,
}

Formát souboru skriptu

Skript musí obsahovat funkci která vrací objekt typu Enak.Script (typicky getScript()) a konfiguraci spotřeb budov a produkcí elektráren.

Skript začíná importy knihoven

py
from enak.Enak import *
from random import randint

Konfigurace spotřeb budov

první číslo je denní spotřeba, druhé noční

py
building_consumptions = {
	Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
	
	Building.FACTORY: (400, 400),
	Building.STADIUM: (250, 400),
	Building.HOSPITAL: (350, 250),
	Building.UNIVERSITY: (400, 200),
	Building.AIRPORT: (500, 400),
	Building.SHOPPING_MALL: (350, 200),
	Building.TECHNOLOGY_CENTER: (300, 250),
	Building.FARM: (80, 40),
	Building.LIVING_QUARTER_SMALL: (70, 40),
	Building.LIVING_QUARTER_LARGE: (100, 60),
	Building.SCHOOL: (80, 30)
}

Konfigurace produkce elektráren

čísla definují rozsah minimální a maximální produkce pro každý daný typ elektrárny

py
source_productions = {
	Source.COAL: (250, 500),
	Source.HYDRO: (0, 200),
	Source.HYDRO_STORAGE: (-200, 200),
	Source.GAS: (0, 500),
	Source.NUCLEAR: (900, 1000),
	Source.WIND: (0, 100),
	Source.PHOTOVOLTAIC: (0, 100),
	Source.BATTERY: (-200, 200)
}

Makro CITY_CENTERS

V Enak.py je naimplementováno makro CITY_CENTERS, které obsahuje pole [CITY_CENTER_A, CITY_CENTER_B, CITY_CENTER_C, CITY_CENTER_D, CITY_CENTER_E, CITY_CENTER_F] a tak zjednodušuje inkrementální změny všech center měst, která mají jinou spotřebu pro každý z tymů.

Samotný scénář

samotný skript tvoříme ve funkci getScript() (nebo jinak vhodně pojmenované), která na začátku vytvoří objekt Script a na konci tento objekt vrací

py
def getScript():
	script = Script(building_consumptions, source_productions)

	#script.setVerbose(True)

	#... zbytek scénáře zde

	return skript

V samotném scénáři můžeme vytvořit 4 typy kol: Den, Noc, Slide a SlideRange. Ty se vytváří takto:

Slide

řetězec v konstruktoru Slide(str) odkazuje na soubor ve složce CoreAPI/presentations

py
	sl = Slide("normal/24.svg")
	script.addRound(sl)

Slide Range

zobrazí více slidů v sekvenci, s ukazatelem na kolikátém slidu se nacházíme (dole uprostřed)

py
	sr = SlideRange(["demo/outputname-01.png",
					"normal/03.svg",
					"normal/04.svg",
					"normal/05.svg",
					"normal/06.svg",
					"normal/07.svg",
					"normal/08.svg"])

	script.addRound(sr)

Den / Noc

jednoduché vytvoření denního kola je následovné

py
	d = (Day()
		.comment("Uhelky")
		.build())
	script.addRound(d)

případně pouze (komentář není vyžadován)

py
	n = Night().build()
	script.addRound(n)

pro dny s počasím stačí přidat

py
	d = (Day()
		.sunny()
		.windy()
		.build())
	script.addRound(d)

kde počasí je typu: sunny(), windy(), breezy(), calm(), cloudy(), partly_cloudy(), foggy(), snowy(), rainy().

Pro výpadek zdroje lze použít metodu outage(Source.TYPE), tedy například:

py
	n = (Night()
		.windy()
		.outage(Source.GAS)
		.build())
	script.addRound(n)

a lze změnit spotřebu budov pomocí .addBuildingModifier(self, building: Building, modifier: float) (pro jednu budovu), nebo například .addBuildingModifiers(self, buildings: List[Building], modifier: float) (pro více budov).

py
	d = (Day()
		.comment("MS v hokeji, porucha plyn elektrárny")
		.addBuildingModifiers(CITY_CENTERS, 600)
		.outage(Source.GAS)
		.sunny()
		.windy()
		.build())
	script.addRound(d)

Pro manuální konfiguraci lze použít metodu setCoefficient(self, source: Source, coefficient: float).

Poznámka

Je nutné vždy po dokončení kola toto kolo přidat do skriptu za použití script.addRound(round).

Modifikace, povolení výroby

Before each added round, you can also change the consumption coefficients, and allow productions. This is done in the following manner

py
	script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60)) #změna budov pro makro CITY_CENTERS
	script.allowProduction(Source.HYDRO) #povolení produkce na HYDRO
	script.allowProduction(Source.HYDRO_STORAGE)

	d = Day().build()
	script.addRound(d)

změna v changeBuildingsConsumptions (více budov), nebo changeBuildingConsumption je permanentní (promítá se do všech následujících kol), a jedná se o navýšení aktuální spotřeby a zadané budovy (den a noc).

Příklady souborů

Níže jsou uvedeny vzorové scénáře, implementované ve webové verzi enak.cz

py
from enak.Enak import *
from random import randint

building_consumptions = {
	Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
	
	Building.FACTORY: (400, 400),
	Building.STADIUM: (250, 400),
	Building.HOSPITAL: (350, 250),
	Building.UNIVERSITY: (400, 200),
	Building.AIRPORT: (500, 400),
	Building.SHOPPING_MALL: (350, 200),
	Building.TECHNOLOGY_CENTER: (300, 250),
	Building.FARM: (80, 40),
	Building.LIVING_QUARTER_SMALL: (70, 40),
	Building.LIVING_QUARTER_LARGE: (100, 60),
	Building.SCHOOL: (80, 30)
}

source_productions = {
	#these numbers define the minimum and maximum
	Source.COAL: (250, 500),
	Source.HYDRO: (0, 200),
	Source.HYDRO_STORAGE: (-200, 200),
	Source.GAS: (0, 500),
	Source.NUCLEAR: (900, 1000),
	Source.WIND: (0, 100),
	Source.PHOTOVOLTAIC: (0, 100),
	Source.BATTERY: (-200, 200)
}

def getScript():
	script = Script(building_consumptions, source_productions)

	#script.setVerbose(True)

	#FÁZE 1 - prezentace
	sr = SlideRange(["demo/outputname-01.png",
					#"demo/outputname-02.png",
					"normal/03.svg",
					"normal/04.svg",
					"normal/05.svg",
					"normal/06.svg",
					"normal/07.svg",
					"normal/08.svg"])

	script.addRound(sr)

	#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
	script.allowProduction(Source.COAL)

	d = (Day()
		.comment("Uhelky")
		.build())
	script.addRound(d)

	s = Slide("normal/12.svg")
	script.addRound(s)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/14.svg")
	script.addRound(sl)

	#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
	script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60))
	script.allowProduction(Source.HYDRO)
	script.allowProduction(Source.HYDRO_STORAGE)

	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/17.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/19.svg")
	script.addRound(sl)

	#FÁZE 4 - JADERKY
	script.allowProduction(Source.NUCLEAR)
	script.changeBuildingsConsumptions(CITY_CENTERS, (150, 150))

	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/22.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/24.svg")
	script.addRound(sl)

	#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
	script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
	script.allowProduction(Source.GAS)
	
	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/27.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sr = SlideRange(["normal/29.svg",
					"normal/30.svg",
					"normal/31.svg"])

	script.addRound(sr)

	#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
	script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
	script.allowProduction(Source.WIND)
	script.allowProduction(Source.PHOTOVOLTAIC)
	script.allowProduction(Source.BATTERY)

	d = (Day()
		.sunny()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.windy()
		.build())

	script.addRound(n)

	sl = Slide("normal/snowy.svg")
	script.addRound(sl)

	# Scénář 1: zima, zataženo, sněží, je bezvětří
	d = (Day()
		.snowy()
		.calm()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.snowy()
		.calm()
		.build())

	script.addRound(n)


	sl = Slide("normal/39.svg")
	script.addRound(sl)

	#scénář 2: MS v hokeji, porucha plyn elektrárny
	# spotřeba vyrostla o 600MW ve dne v noci o 450MW

	d = (Day()
		.comment("MS v hokeji, porucha plyn elektrárny")
		.addBuildingModifiers(CITY_CENTERS, 600)
		.outage(Source.GAS)
		.sunny()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.addBuildingModifiers(CITY_CENTERS, 450)
		.outage(Source.GAS)
		.windy()
		.build())

	script.addRound(n)

	sr = SlideRange(["normal/36.svg",
					"normal/37.svg",
					"normal/38.svg"])

	script.addRound(sr)

	return script

if __name__ == "__main__":
	s = getScript()
py
from enak.Enak import *
from random import randint

building_consumptions = {
	Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
	
	Building.FACTORY: (400, 400),
	Building.STADIUM: (250, 400),
	Building.HOSPITAL: (350, 250),
	Building.UNIVERSITY: (400, 200),
	Building.AIRPORT: (500, 400),
	Building.SHOPPING_MALL: (350, 200),
	Building.TECHNOLOGY_CENTER: (300, 250),
	Building.FARM: (80, 40),
	Building.LIVING_QUARTER_SMALL: (70, 40),
	Building.LIVING_QUARTER_LARGE: (100, 60),
	Building.SCHOOL: (80, 30)
}

source_productions = {
	#these numbers define the minimum and maximum
	Source.COAL: (250, 500),
	Source.HYDRO: (0, 200),
	Source.HYDRO_STORAGE: (-200, 200),
	Source.GAS: (0, 500),
	Source.NUCLEAR: (900, 1000),
	Source.WIND: (0, 100),
	Source.PHOTOVOLTAIC: (0, 100),
	Source.BATTERY: (-200, 200)
}

def getScript():
	script = Script(building_consumptions, source_productions)

	#script.setVerbose(True)

	#FÁZE 1 - prezentace
	sr = SlideRange(["demo/outputname-01.png",
					#"demo/outputname-02.png",
					"normal/03.svg",
					"normal/04.svg",
					"normal/05.svg",
					"normal/06.svg",
					"normal/07.svg",
					"normal/08.svg"])

	script.addRound(sr)

	#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
	script.allowProduction(Source.COAL)

	d = (Day()
		.comment("Uhelky")
		.build())
	script.addRound(d)

	s = Slide("normal/12.svg")
	script.addRound(s)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/14.svg")
	script.addRound(sl)

	#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
	script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60))
	script.allowProduction(Source.HYDRO)
	script.allowProduction(Source.HYDRO_STORAGE)

	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/17.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/19.svg")
	script.addRound(sl)

	#FÁZE 4 - JADERKY
	script.allowProduction(Source.NUCLEAR)
	script.changeBuildingsConsumptions(CITY_CENTERS, (150, 150))

	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/22.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/24.svg")
	script.addRound(sl)

	#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
	script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
	script.allowProduction(Source.GAS)
	
	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/27.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sr = SlideRange(["normal/29.svg",
					"normal/30.svg",
					"normal/31.svg"])

	script.addRound(sr)

	#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
	script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
	script.allowProduction(Source.WIND)
	script.allowProduction(Source.PHOTOVOLTAIC)
	script.allowProduction(Source.BATTERY)

	d = (Day()
		.sunny()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.windy()
		.build())

	script.addRound(n)

	sl = Slide("normal/39.svg")
	script.addRound(sl)

	#scénář 2: MS v hokeji, porucha plyn elektrárny
	# spotřeba vyrostla o 600MW ve dne v noci o 450MW

	d = (Day()
		.comment("MS v hokeji, porucha plyn elektrárny")
		.addBuildingModifiers(CITY_CENTERS, 600)
		.outage(Source.GAS)
		.partly_cloudy()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.addBuildingModifiers(CITY_CENTERS, 450)
		.outage(Source.GAS)
		.breezy()
		.build())

	script.addRound(n)

	sr = SlideRange(["normal/36.svg",
					"normal/37.svg",
					"normal/38.svg"])

	script.addRound(sr)

	return script

if __name__ == "__main__":
	s = getScript()
py
from enak.Enak import *
from random import randint

building_consumptions = {
	Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
	
	Building.FACTORY: (400, 400),
	Building.STADIUM: (250, 400),
	Building.HOSPITAL: (350, 250),
	Building.UNIVERSITY: (400, 200),
	Building.AIRPORT: (500, 400),
	Building.SHOPPING_MALL: (350, 200),
	Building.TECHNOLOGY_CENTER: (300, 250),
	Building.FARM: (80, 40),
	Building.LIVING_QUARTER_SMALL: (70, 40),
	Building.LIVING_QUARTER_LARGE: (100, 60),
	Building.SCHOOL: (80, 30)
}

source_productions = {
	#these numbers define the minimum and maximum
	Source.COAL: (250, 500),
	Source.HYDRO: (0, 200),
	Source.HYDRO_STORAGE: (-200, 200),
	Source.GAS: (0, 500),
	Source.NUCLEAR: (900, 1000),
	Source.WIND: (0, 100),
	Source.PHOTOVOLTAIC: (0, 100),
	Source.BATTERY: (-200, 200)
}

def getScript():
	script = Script(building_consumptions, source_productions)

	#script.setVerbose(True)

	#FÁZE 1 - prezentace
	sr = SlideRange(["demo/outputname-01.png",
					#"demo/outputname-02.png",
					"normal/03.svg",
					"normal/04.svg",
					"normal/05.svg",
					"normal/06.svg",
					"normal/07.svg",
					"normal/08.svg"])

	script.addRound(sr)

	#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
	script.allowProduction(Source.COAL)

	d = (Day()
		.comment("Uhelky")
		.build())
	script.addRound(d)

	s = Slide("normal/12.svg")
	script.addRound(s)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/14.svg")
	script.addRound(sl)

	#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
	script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60))
	script.allowProduction(Source.HYDRO)
	script.allowProduction(Source.HYDRO_STORAGE)

	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/17.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/19.svg")
	script.addRound(sl)

	#FÁZE 4 - JADERKY
	script.allowProduction(Source.NUCLEAR)
	script.changeBuildingsConsumptions(CITY_CENTERS, (150, 150))

	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/22.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sl = Slide("normal/24.svg")
	script.addRound(sl)

	#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
	script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
	script.allowProduction(Source.GAS)
	
	d = Day().build()
	script.addRound(d)

	sl = Slide("normal/27.svg")
	script.addRound(sl)

	n = Night().build()
	script.addRound(n)

	sr = SlideRange(["normal/29.svg",
					"normal/30.svg",
					"normal/31.svg"])

	script.addRound(sr)

	#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
	script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
	script.allowProduction(Source.WIND)
	script.allowProduction(Source.PHOTOVOLTAIC)
	script.allowProduction(Source.BATTERY)

	sl = Slide("normal/39.svg")
	script.addRound(sl)

	#scénář 2: MS v hokeji, porucha plyn elektrárny
	# spotřeba vyrostla o 600MW ve dne v noci o 450MW

	d = (Day()
		.comment("MS v hokeji, porucha plyn elektrárny")
		.addBuildingModifiers(CITY_CENTERS, 600)
		.outage(Source.GAS)
		.partly_cloudy()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.addBuildingModifiers(CITY_CENTERS, 450)
		.outage(Source.GAS)
		.breezy()
		.build())

	script.addRound(n)

	sr = SlideRange(["normal/36.svg",
					"normal/37.svg",
					"normal/38.svg"])

	script.addRound(sr)

	return script

if __name__ == "__main__":
	s = getScript()
py
from enak.Enak import *
from random import randint

building_consumptions = {
	Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
	
	Building.FACTORY: (400, 400),
	Building.STADIUM: (250, 400),
	Building.HOSPITAL: (350, 250),
	Building.UNIVERSITY: (400, 200),
	Building.AIRPORT: (500, 400),
	Building.SHOPPING_MALL: (350, 200),
	Building.TECHNOLOGY_CENTER: (300, 250),
	Building.FARM: (80, 40),
	Building.LIVING_QUARTER_SMALL: (70, 40),
	Building.LIVING_QUARTER_LARGE: (100, 60),
	Building.SCHOOL: (80, 30)
}

source_productions = {
	#these numbers define the minimum and maximum
	Source.COAL: (250, 500),
	Source.HYDRO: (0, 200),
	Source.HYDRO_STORAGE: (-200, 200),
	Source.GAS: (0, 500),
	Source.NUCLEAR: (900, 1000),
	Source.WIND: (0, 100),
	Source.PHOTOVOLTAIC: (0, 100),
	Source.BATTERY: (-200, 200)
}

def getScript():
	script = Script(building_consumptions, source_productions)

	#script.setVerbose(True)

	#FÁZE 1 - prezentace
	sr = Slide("demo/outputname-01.png")

	script.addRound(sr)

	script.allowProduction(Source.COAL)
	script.allowProduction(Source.HYDRO)
	script.allowProduction(Source.HYDRO_STORAGE)
	script.allowProduction(Source.NUCLEAR)
	script.allowProduction(Source.GAS)
	script.allowProduction(Source.WIND)
	script.allowProduction(Source.PHOTOVOLTAIC)
	script.allowProduction(Source.BATTERY)

	sl = Slide("normal/39.svg")
	script.addRound(sl)

	d = (Day()
		.sunny()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.windy()
		.build())

	script.addRound(n)

	return script

if __name__ == "__main__":
	s = getScript()
py
from enak.Enak import *
from random import randint

building_consumptions = {
	Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
	Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
	
	Building.FACTORY: (400, 400),
	Building.STADIUM: (250, 400),
	Building.HOSPITAL: (350, 250),
	Building.UNIVERSITY: (400, 200),
	Building.AIRPORT: (500, 400),
	Building.SHOPPING_MALL: (350, 200),
	Building.TECHNOLOGY_CENTER: (300, 250),
	Building.FARM: (80, 40),
	Building.LIVING_QUARTER_SMALL: (70, 40),
	Building.LIVING_QUARTER_LARGE: (100, 60),
	Building.SCHOOL: (80, 30)
}

source_productions = {
	#these numbers define the minimum and maximum
	Source.COAL: (250, 500),
	Source.HYDRO: (0, 200),
	Source.HYDRO_STORAGE: (-200, 200),
	Source.GAS: (0, 500),
	Source.NUCLEAR: (900, 1000),
	Source.WIND: (0, 100),
	Source.PHOTOVOLTAIC: (0, 100),
	Source.BATTERY: (-200, 200)
}

def getScript():
	script = Script(building_consumptions, source_productions)

	#script.setVerbose(True)

	#FÁZE 1 - prezentace
	sr = Slide("demo/outputname-01.png")

	script.addRound(sr)

	script.allowProduction(Source.COAL)
	script.allowProduction(Source.HYDRO)
	script.allowProduction(Source.HYDRO_STORAGE)
	script.allowProduction(Source.NUCLEAR)
	script.allowProduction(Source.GAS)
	script.allowProduction(Source.WIND)
	script.allowProduction(Source.PHOTOVOLTAIC)
	script.allowProduction(Source.BATTERY)

	sl = Slide("normal/39.svg")
	script.addRound(sl)

	d = (Day()
		.sunny()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.windy()
		.build())

	script.addRound(n)

	sl = Slide("normal/39.svg")
	script.addRound(sl)

	d = (Day()
		.comment("MS v hokeji, porucha plyn elektrárny")
		.addBuildingModifiers(CITY_CENTERS, 600)
		.outage(Source.GAS)
		.cloudy()
		.windy()
		.build())

	script.addRound(d)

	sl = Slide("normal/34.svg")
	script.addRound(sl)

	n = (Night()
		.addBuildingModifiers(CITY_CENTERS, 450)
		.outage(Source.GAS)
		.windy()
		.build())

	script.addRound(n)

	return script

if __name__ == "__main__":
	s = getScript()
py
from enak.Enak import *
import os

# Global debug flag from environment variable
DEBUG = os.getenv('DEBUG', 'false').lower() == 'true'

building_consumptions = {
	#these numbers define the (day, night) consumption of the specific buildings
	Building.CITY_CENTER_A: (575, 200),
	Building.CITY_CENTER_B: (600, 200),
	Building.CITY_CENTER_C: (620, 200),
	Building.CITY_CENTER_D: (550, 200),
	Building.CITY_CENTER_E: (625, 200),
	Building.CITY_CENTER_F: (550, 200),
	
	Building.FACTORY: (400, 400),
	Building.STADIUM: (250, 400),
	Building.HOSPITAL: (350, 250),
	Building.UNIVERSITY: (400, 200),
	Building.AIRPORT: (500, 400),
	Building.SHOPPING_MALL: (350, 200),
	Building.TECHNOLOGY_CENTER: (300, 250),
	Building.FARM: (80, 40),
	Building.LIVING_QUARTER_SMALL: (70, 40),
	Building.LIVING_QUARTER_LARGE: (100, 60),
	Building.SCHOOL: (80, 30)
}

source_productions = {
	#these numbers define the minimum and maximum
	Source.COAL: (250, 500),
	Source.HYDRO: (0, 100),
	Source.HYDRO_STORAGE: (-200, 200),
	Source.GAS: (0, 500),
	Source.NUCLEAR: (900, 1000),
	Source.WIND: (0, 100),
	Source.PHOTOVOLTAIC: (0, 100),
	Source.BATTERY: (-200, 200)
}

def getScript():
	script = Script(building_consumptions, source_productions)

	script.setVerbose(DEBUG)

	#FÁZE 1 - prezentace
	sr = SlideRange(["demo/outputname-01.png", "demo/outputname-02.png", "demo/outputname-03.png"])
	script.addRound(sr)

	sl = Slide("demo/outputname-04.png")
	script.addRound(sl)

	#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
	script.allowProduction(Source.COAL)

	d = (Day()
		.comment("Uhelky")
		.build())
	script.addRound(d)

	n = Night().build()
	script.addRound(n)

	sl = Slide("demo/outputname-05.png")
	script.addRound(sl)

	#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
	script.changeBuildingsConsumptions(CITY_CENTERS, (60, 120))
	script.allowProduction(Source.HYDRO)
	script.allowProduction(Source.HYDRO_STORAGE)
	script.allowProduction(Source.BATTERY)

	d = Day().build()
	script.addRound(d)

	n = Night().build()
	script.addRound(n)

	sl = Slide("demo/outputname-06.png")
	script.addRound(sl)

	#FÁZE 4 - jaderky, spotřeba roste o 100MW
	script.allowProduction(Source.NUCLEAR)
	script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))

	d = Day().build()
	script.addRound(d)

	n = Night().build()
	script.addRound(n)

	sl = Slide("demo/outputname-07.png")
	script.addRound(sl)

	#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
	script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
	script.allowProduction(Source.GAS)
	
	d = Day().build()
	script.addRound(d)

	n = Night().build()
	script.addRound(n)

	sl = Slide("demo/outputname-08.png")
	script.addRound(sl)

	#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
	script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
	script.allowProduction(Source.WIND)
	script.allowProduction(Source.PHOTOVOLTAIC)

	#normal calm day (average wind, average sun)
	d = Day().sunny().breezy().build()
	script.addRound(d)

	n = Night().breezy().build()
	script.addRound(n)

	sl = Slide("demo/outputname-09.png")
	script.addRound(sl)
	#FÁZE 7 - scénáře

	# Je zima, zataženo, sněží a je bezvětří.
	d = (Day()
		.snowy()
		.calm()
		.cloudy()
		.build())
	script.addRound(d)

	n = (Night()
		.snowy()
		.calm()
		.cloudy()
		.build())
	script.addRound(n)

	sl = Slide("demo/outputname-10.png")
	script.addRound(sl)

	# MS v hokeji, více lidí ve městě, porucha plynové elektrárny
	d = (Day()
		.sunny()
		.windy()
		.outage(Source.GAS)
		.addBuildingModifier(Building.STADIUM, 50)
		.addBuildingModifiers(CITY_CENTERS, 600)
		.comment("MS v hokeji")
		.build())
	script.addRound(d)

	n = (Night()
		.windy()
		.outage(Source.GAS)
		.addBuildingModifier(Building.STADIUM, 100)
		.addBuildingModifiers(CITY_CENTERS, 450)
		.build())
	script.addRound(n)
	
	return script

if __name__ == "__main__":
	s = getScript()