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()