Kampf um Resourcen. Programmieren von Gewusel: Unterschied zwischen den Versionen
aus dem Wiki des Entropia e.V., CCC Karlsruhe
Keine Bearbeitungszusammenfassung |
Laus (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(10 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Datei:Infon.jpg|right]] | |||
== Sourcecode == | |||
Ich habe auf http://infon.dividuum.de eine vorerst minimale Seite zum Spiel eingerichtet. Dort gibt es den Sourcecode. | |||
Wenn ihr das Spiel irgendwo laufen lasst, waere es super, wenn ihr Bilder davon an mich (Email Adresse siehe obige Seite) schickt/bei flickr postet. | |||
== Feature Requests == | == Feature Requests == | ||
Zeile 8: | Zeile 16: | ||
* laengere kaempfe? | * laengere kaempfe? | ||
** done. nur noch halbe hitpoints bei kaempfen ''--dividuum'' | ** done. nur noch halbe hitpoints bei kaempfen ''--dividuum'' | ||
* fuettern schneller als essen ''--kcarccmkcaj'' | |||
* mehr essen? | * mehr essen? | ||
* mehr bass! | |||
* blackjack und nutten! | |||
* kein selbstmord | |||
** doch. wird aber haerter bestraft. | |||
* server sourcen irgendwo schon zu haben ? | |||
** jetzt schon | |||
== Beispiel-Scripte == | == Beispiel-Scripte == | ||
Zeile 115: | Zeile 130: | ||
end | end | ||
--------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ||
</pre> | </pre> | ||
Zeile 354: | Zeile 369: | ||
</pre> | </pre> | ||
[[Kategorie:GPN]] | |||
[[Kategorie:GPN5]] | |||
[[Kategorie:Spiele]] |
Aktuelle Version vom 21. Juli 2017, 21:53 Uhr
Sourcecode
Ich habe auf http://infon.dividuum.de eine vorerst minimale Seite zum Spiel eingerichtet. Dort gibt es den Sourcecode.
Wenn ihr das Spiel irgendwo laufen lasst, waere es super, wenn ihr Bilder davon an mich (Email Adresse siehe obige Seite) schickt/bei flickr postet.
Feature Requests
- Möglichkeit für *alle* spieler, sich die Punkte anzeigen zu lassen (evtl. per Kommando "p" an der Konsole?)
- Erm, "p" ist ja schon part game. Wie waers mit "s" (wie stats)? --codec
- Ich baue das bei der naechsten Iteration ein --dividuum
- Erm, "p" ist ja schon part game. Wie waers mit "s" (wie stats)? --codec
- mehr farben
- done. sind jetzt 16 unterschiedliche --dividuum
- laengere kaempfe?
- done. nur noch halbe hitpoints bei kaempfen --dividuum
- fuettern schneller als essen --kcarccmkcaj
- mehr essen?
- mehr bass!
- blackjack und nutten!
- kein selbstmord
- doch. wird aber haerter bestraft.
- server sourcen irgendwo schon zu haben ?
- jetzt schon
Beispiel-Scripte
Blueloop V00
-------------------------------------------------------------------------- -- Blueloop V00 -- -- Fuer jedes gespawnte Vieh wird eine eigene Creature Klasse instanziiert -------------------------------------------------------------------------- function Creature:onSpawned() print("Creature " .. self.id .. " spawned") end function Creature:onAttacked(attacker) print("Help! Creature " .. self.id .. " is attacked by Creature " .. attacker) end function Creature:onKilled(killer) if killer == self.id then print("Creature " .. self.id .. " suicided") elseif killer then print("Creature " .. self.id .. " killed by Creature " .. killer) else print("Creature " .. self.id .. " died") end end function Wait() while (get_state(self.id) ~= CREATURE_IDLE) do self:wait_for_next_round() end; end function Creature:main() if self.dx == nil then self.dx = 256 end if self.dy == nil then self.dy = 0 end if victim == nil then victim = -1 end ---------------------------------------------- Wenn ein globaler Angriff aktiv ist: if (victim ~= -1) and (get_type(self.id) == 1) then if exists(victim) then local x,y = get_pos(victim) -- Wo ist der angegriffene? self:moveto(x,y) -- hinlaufen self:attack(victim) -- angreifen! else victim = -1 -- Tot -> Angriff beenden print"Angriff beendet!" end end ---------------------------------------------- Warten bis Creatur IDLE if get_state(self.id) ~= CREATURE_IDLE then self:wait_for_next_round() return end ---------------------------------------------- Wo ist der nächste Feind? local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) ---------------------------------------------- Wenn er nah genug ist und wir gesund sind -> angreifen if (feind_id ~= nil) and (victim == -1) then if (feind_dist < 8000) and (self:health() > 50) and (victim == -1) then print("Starte Angriff auf " .. feind_id ) victim = feind_id end end ---------------------------------------------- Fressen! if get_tile_food(self.id) > 0 then set_state(self.id, CREATURE_EAT) else local x, y = self:pos() if not self:moveto(x+self.dx,y+self.dy) then self.dx = math.random(512)-256 self.dy = math.random(512)-256 end end if self:health() < 90 then set_state(self.id, CREATURE_HEAL) end; if get_food(self.id) > 8000 then if get_type(self.id) == 0 then set_convert(self.id, 1) set_state(self.id,CREATURE_CONVERT) else set_state(self.id,CREATURE_SPAWN) end end if get_state(self.id) == CREATURE_IDLE then self:moveto(get_koth_pos()) end self:wait_for_next_round() end ---------------------------------------------------------------------------------
Blueloop V01
-------------------------------------------------------------------------- -- Default Logik -- -- Fuer jedes gespawnte Vieh wird eine eigene Creature Klasse instanziiert -------------------------------------------------------------------------- function Creature:onSpawned() print("Creature " .. self.id .. " spawned") end function Creature:onAttacked(attacker) print("Help! Creature " .. self.id .. " is attacked by Creature " .. attacker) -- Ich bin noch zu klein zum kämpfen if (get_type(self.id) == 0) or (self:health() > 20) then local x,y = self:pos() -- weglaufen self:set_path(x-16000+math.random(8000),y-1600+math.random(8000)) self:begin_walk_path() else -- Smack my Bit up! self:set_target(attacker) self:begin_attacking() end end function Creature:onKilled(killer) if killer == self.id then print("Creature " .. self.id .. " suicided") elseif killer then print("Creature " .. self.id .. " killed by Creature " .. killer) else print("Creature " .. self.id .. " died") end end function Creature:Wait() while (get_state(self.id) ~= CREATURE_IDLE) do self:wait_for_next_round() end; end function Creature:Fressen() if get_tile_food(self.id) > 0 then set_state(self.id, CREATURE_EAT) self:Wait() else local x, y = self:pos() if not self:moveto(x+self.dx,y+self.dy) then self.dx = math.random(256)-128 self.dy = math.random(256)-128 end end if self:health() < 90 then set_state(self.id, CREATURE_HEAL) self:Wait() end end function Creature:Angreifen() -- Wo ist der nächste Feind? local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) -- Wenn er nah genug ist und wir gesund sind -> angreifen if (feind_id ~= nil) and (feind_dist < 500) and (self:health() > 60) then print("Starte Angriff auf " .. feind_id .. " Abstand: " .. feind_dist) while (exists(feind_id)) do local x,y = get_pos(feind_id) -- Wo ist der angegriffene? self:moveto(x,y) -- hinlaufen self:attack(feind_id) -- angreifen! self:Wait() end end end function Creature:main() if self.dx == nil then self.dx = 256 end if self.dy == nil then self.dy = 0 end if victim == nil then victim = -1 end if get_type(self.id) == 0 then print("Creature " .. self.id .. " soll fressen") while get_food(self.id) < 8000 do self:Fressen() end print("Creature " .. self.id .. " soll sich verwandeln") set_convert(self.id, 1) set_state(self.id,CREATURE_CONVERT) self:Wait() else print("Creature " .. self.id .. " soll fressen") while get_food(self.id) < 8000 do self:Fressen() self:Angreifen() end print("Creature " .. self.id .. " vermehrt sich") set_state(self.id,CREATURE_SPAWN) self:Wait() --print("Creature " .. self.id .. " soll zu King of the Hill") --self:moveto(get_koth_pos()) --self:Wait() --print("Creature " .. self.id .. " ist King of the Hill") --while self:health() > 30 do -- local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) -- self:attack(feind_id) --end end end
Updater
require 'socket' require 'timeout' class GameConn def initialize @sock = TCPSocket.new('23.42.2.254', 1234) while buf = read_with_timeout if buf =~ /Press \<enter\>/ @sock.puts elsif buf =~ /enter '\?' for help/ @sock.puts 'j' elsif buf =~ /enter \<playernum\> or press enter for new player: / return end end end def join_already(num, password) @sock.puts(num) while buf = read_with_timeout if buf =~ /password for player \d+: / @sock.puts(password) elsif buf =~ /joined\. / return elsif buf =~/could not attach to player/ raise buf end end end def join_new(password) @sock.puts while buf = read_with_timeout if buf =~ /password for new player: / @sock.puts(password) elsif buf =~ /joined\. / puts buf return end end end def name=(n) @sock.puts 'n' while buf = read_with_timeout if buf =~ /Player Name: / @sock.puts n elsif buf =~ /\> / return elsif buf =~ /cannot set name/ raise buf end end end def read_with_timeout buf = '' while buf.size == 0 begin Timeout::timeout(0.1) { buf += @sock.read(1) while true } rescue Timeout::Error end end buf end def debug_loop! while buf = read_with_timeout print buf end end def batch(source) @sock.puts 'b' while buf = read_with_timeout if buf =~ /enter your lua code/ @sock.puts source + "\n." elsif buf =~ /\> / return end end end end g = GameConn.new if true # Bei Bedarf zu false ändern g.join_already(6, '123') else g.join_new('123') end g.name = 'CoolBot' g.batch(IO::readlines('coolbot.lua').to_s) g.debug_loop!
Update Makefile
PASS=XXX PLAYERNO=XXX IP=23.42.2.254 all: (echo ; echo j; echo ${PLAYERNO}; echo ${PASS}; echo b; cat bot.lua; echo ; echo .; echo r; echo q) | netcat ${IP} 1234