from .models import ( Fusion, Config, Monster, MonsterItem, Deck, Phase, Trigger, Grave, Hand, UserPoint, MonsterEffectWrapper, EndChainEffect, CostWrapper, DuelDeck, DuelGrave, DuelHand, FieldSize, TriggerTiming, Timing, PacWrapper, PacCostWrapper, EternalEffect, VirtualVariable, EternalTrigger, UnderDirection, TriggerTimingChangeVal, TriggerTimingNotEffected, TriggerTimingMonsterChangeVal, TriggerTimingRelation, ) from django.db.models import Q from django.db import reset_queries import inspect import json import re import os import uuid from django.db import connection import random import copy from pprint import pprint import inspect import numpy as np from time import time import html class DuelObj: invoke_flag = False def __init__(self, room_number): pass def copy_monster_from_deck(self, monster, deck_id, mine_or_other): # 移動した場合idをorg_idに戻す monster["id"] = monster["org_id"] if "from2" in monster: del monster["from2"] if "from_field_kind" in monster: del monster["from_field_kind"] monster["from"] = "deck" monster["from_deck_id"] = deck_id if "eternal" in monster: for key in reversed(range(len(monster["eternal"]))): if "persist" not in monster["eternal"][key]: monster["eternal"].pop(key) monster["flag"] = 0 monster["turncount"] = self.duel.turn_count if "rel" in monster: del monster["rel"] return monster def copy_monster_from_under(self, monster): # 移動した場合idをorg_idに戻す monster["id"] = monster["org_id"] if "eternal" in monster: for key in reversed(range(len(monster["eternal"]))): if "persist" not in monster["eternal"][key]: monster["eternal"].pop(key) monster["flag"] = 0 monster["turncount"] = self.duel.turn_count if "rel" in monster: del monster["rel"] return monster def copy_monster_from_grave(self, monster, deck_id, mine_or_other): # 移動した場合idをorg_idに戻す monster["id"] = monster["org_id"] monster["flag"] = 0 monster["from"] = "grave" monster["from_deck_id"] = deck_id if "from2" in monster: del monster["from2"] if "from_field_kind" in monster: del monster["from_field_kind"] if "eternal" in monster: for key in reversed(range(len(monster["eternal"]))): if monster["eternal"][key] is None or "persist" not in monster["eternal"][key]: monster["eternal"].pop(key) if "rel" in monster: del monster["rel"] monster["turncount"] = self.duel.turn_count return monster def copy_monster_from_hand(self, monster, deck_id, mine_or_other): # 移動した場合idをorg_idに戻す monster["id"] = monster["org_id"] monster["flag"] = 0 monster["from"] = "hand" monster["from_deck_id"] = deck_id if "from2" in monster: del monster["from2"] if "from_field_kind" in monster: del monster["from_field_kind"] if "rel" in monster: del monster["rel"] if "eternal" in monster and monster["eternal"] is not None: for key in reversed(range(len(monster["eternal"]))): if monster["eternal"][key] is None or "persist" not in monster["eternal"][key]: monster["eternal"].pop(key) monster["turncount"] = self.duel.turn_count return monster def copy_monster_from_field(self, monster, kind, mine_or_other): monster["from2"] = "field" monster["from_field_kind"] = kind monster["from_field_mine_or_other"] = mine_or_other return monster def copy_monster_to_deck( self, monster, deck_id, mine_or_other, variable_names=None ): duel = self.duel # 移動した場合idをorg_idに戻す monster["id"] = monster["org_id"] monster["flag"] = 0 if "etenral" in monster: del monster["eternal"] if "under" in monster: direction = UnderDirection.objects.filter( Q(to_place_kind=1) | Q(to_place_kind=0) ) direction = direction.filter(to_deck__id=deck_id) if self.user == 1: mine_or_other2 = mine_or_other elif self.user == 2: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other direction = direction.filter(Q(to_mine_or_other=mine_or_other2) | Q(to_mine_or_other = 0)) direction = direction.first() mine_or_other2 = direction.dest_mine_or_other dest = direction.dest_place_kind shuffle = direction.shuffle if dest == 1: deck_id = direction.dest_deck.id self.move_unders_to_deck( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 2: deck_id = direction.dest_grave.id self.move_unders_to_grave( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 3: deck_id = direction.dest_hand.id self.move_unders_to_hand( monster["under"], deck_id, shuffle, mine_or_other2 ) del monster["under"] monster["place_unique_id"] = str(uuid.uuid4()) monster["place"] = "deck" monster["mine_or_other"] = mine_or_other monster["deck_id"] = deck_id monster["turncount"] = self.duel.turn_count if "kind" in monster: del monster["kind"] if "rel" in monster: del monster["rel"] return monster def copy_monster_to_grave( self, monster, deck_id, mine_or_other, variable_names=None ): duel = self.duel # 移動した場合idをorg_idに戻す monster["flag"] = 0 if "eternal" in monster and monster["eternal"] is not None: for key in reversed(range(len(monster["eternal"]))): if monster["eternal"][key] is None or "persist" not in monster["eternal"][key]: monster["eternal"].pop(key) if "under" in monster: direction = UnderDirection.objects.filter( Q(to_place_kind=2) | Q(to_place_kind=0) ) direction = direction.filter(to_grave__id=deck_id) if self.user == 1: mine_or_other2 = mine_or_other elif self.user == 2: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other direction = direction.filter(Q(to_mine_or_other=mine_or_other2) | Q(to_mine_or_other = 0)) direction = direction.first() dest = direction.dest_place_kind shuffle = direction.shuffle mine_or_other2 = direction.dest_mine_or_other if dest == 1: deck_id = direction.dest_deck.id self.move_unders_to_deck( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 2: deck_id = direction.dest_grave.id self.move_unders_to_grave( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 3: deck_id = direction.dest_hand.id self.move_unders_to_hand( monster["under"], deck_id, shuffle, mine_or_other2 ) del monster["under"] monster["id"] = monster["org_id"] monster["place_unique_id"] = str(uuid.uuid4()) monster["place"] = "grave" monster["mine_or_other"] = mine_or_other monster["deck_id"] = deck_id monster["turncount"] = self.duel.turn_count if "kind" in monster: del monster["kind"] if "rel" in monster: del monster["rel"] return monster def copy_monster_to_hand( self, monster, deck_id, mine_or_other, variable_names=None ): duel = self.duel # 移動した場合idをorg_idに戻す monster["flag"] = 0 if "eternal" in monster and monster["eternal"] is not None: for key in reversed(range(len(monster["eternal"]))): if monster["eternal"][key] is None or "persist" not in monster["eternal"][key]: monster["eternal"].pop(key) if "under" in monster: direction = UnderDirection.objects.filter( Q(to_place_kind=3) | Q(to_place_kind=0) ) direction = direction.filter(to_hand__id=deck_id) if self.user == 1: mine_or_other2 = mine_or_other elif self.user == 2: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other direction = direction.filter(Q(to_mine_or_other=mine_or_other2) | Q(to_mine_or_other = 0)) direction = direction.first() dest = direction.dest_place_kind shuffle = direction.shuffle mine_or_other2 = direction.dest_mine_or_other if dest == 1: deck_id = direction.dest_deck.id self.move_unders_to_deck( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 2: deck_id = direction.dest_grave.id self.move_unders_to_grave( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 3: deck_id = direction.dest_hand.id self.move_unders_to_hand( monster["under"], deck_id, shuffle, mine_or_other2 ) del monster["under"] monster["id"] = monster["org_id"] monster["place_unique_id"] = str(uuid.uuid4()) monster["place"] = "hand" monster["mine_or_other"] = mine_or_other monster["deck_id"] = deck_id monster["turncount"] = self.duel.turn_count if "kind" in monster: del monster["kind"] if "rel" in monster: del monster["rel"] return monster def copy_monster_to_under( self, monster, deck_id, x, y, mine_or_other, variable_names=None, field=None ): duel = self.duel # 移動した場合idをorg_idに戻す if "eternal" in monster and monster["eternal"] is not None: for key in reversed(range(len(monster["eternal"]))): if monster["eternal"][key] is None or "persist" not in monster["eternal"][key]: monster["eternal"].pop(key) if "under" in monster: direction = UnderDirection.objects.filter( Q(to_place_kind=5) | Q(to_place_kind=0) ) if self.user == 1: mine_or_other2 = mine_or_other elif self.user == 2: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other direction = direction.filter(Q(to_mine_or_other=mine_or_other2) | Q(to_mine_or_other = 0)) direction = direction.first() dest = direction.dest_place_kind shuffle = direction.shuffle mine_or_other2 = direction.dest_mine_or_other if dest == 1: deck_id = direction.dest_deck.id self.move_unders_to_deck( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 2: deck_id = direction.dest_grave.id self.move_unders_to_grave( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 3: deck_id = direction.dest_hand.id self.move_unders_to_hand( monster["under"], deck_id, shuffle, mine_or_other2 ) elif dest == 5: if "under" in monster: for under in monster["under"]: field["under"].append(under) del monster["under"] monster["id"] = monster["org_id"] monster["place_unique_id"] = str(uuid.uuid4()) monster["place"] = "hand" monster["mine_or_other"] = mine_or_other monster["deck_id"] = deck_id monster["turncount"] = self.duel.turn_count if "kind" in monster: del monster["kind"] field["under"].append(monster) if "rel" in monster: del monster["rel"] return field def move_unders_to_deck(self, unders, deck_id, shuffle, mine_or_other2): duel = self.duel if self.user == 1: other_user = 2 else: other_user = 1 for under in unders: if mine_or_other2 == 1: deck = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: deck = self.decks[deck_id]["otherdeck"] elif mine_or_other2 == 3: deck = self.decks[deck_id]["commondeck"] elif mine_or_other2 == 4: if self.user == under["owner"]: deck = self.decks[deck_id]["mydeck"] elif other_user == under["owner"]: deck = self.decks[deck_id]["otherdeck"] else: deck = self.decks[deck_id]["commondeck"] under["turncount"] = self.duel.turn_count user_decks = deck user_decks.append(under) if shuffle is True: np.random.shuffle(user_decks) if mine_or_other2 == 1: self.decks[deck_id]["mydeck"] = user_decks elif mine_or_other2 == 2: self.decks[deck_id]["otherdeck"] = user_decks elif mine_or_other2 == 3: self.decks[deck_id]["commondeck"] = user_decks elif mine_or_other2 == 4: if self.user == under["owner"]: self.decks[deck_id]["mydeck"] = user_decks elif other_user == under["owner"]: self.decks[deck_id]["otherdeck"] = user_decks else: self.decks[deck_id]["commondeck"] = user_decks def move_unders_to_grave(self, unders, deck_id, shuffle, mine_or_other2): duel = self.duel if self.user == 1: other_user = 2 else: other_user = 1 for under in unders: if mine_or_other2 == 1: grave = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: grave = self.graves[deck_id]["othergrave"] elif mine_or_other2 == 3: grave = self.graves[deck_id]["commongrave"] elif mine_or_other2 == 4: if self.user == under["owner"]: grave = self.graves[deck_id]["mygrave"] elif other_user == under["owner"]: grave = self.graves[deck_id]["othergrave"] else: grave = self.graves[deck_id]["commongrave"] user_graves = grave under["turncount"] = self.duel.turn_count user_graves.append(under) if shuffle is True: np.random.shuffle(user_graves) if mine_or_other2 == 1: self.graves[deck_id]["mygrave"] = user_graves elif mine_or_other2 == 2: self.graves[deck_id]["othergrave"] = user_graves elif mine_or_other2 == 3: self.graves[deck_id]["commongrave"] = user_graves elif mine_or_other2 == 4: if self.user == under["owner"]: self.graves[deck_id]["mygrave"] = user_graves elif other_user == under["owner"]: self.graves[deck_id]["othergrave"] = user_graves else: self.graves[deck_id]["commongrave"] = user_graves def move_unders_to_hand(self, unders, deck_id, shuffle, mine_or_other2): duel = self.duel if self.user == 1: other_user = 2 else: other_user = 1 for under in unders: if mine_or_other2 == 1: hand = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: hand = self.hands[deck_id]["otherhand"] elif mine_or_other2 == 3: hand = self.hands[deck_id]["commonhand"] elif mine_or_other2 == 4: if self.user == under["owner"]: hand = self.hands[deck_id]["myhand"] elif other_user == under["owner"]: hand = self.hands[deck_id]["otherhand"] else: hand = self.hands[deck_id]["commonhand"] under["turncount"] = self.duel.turn_count user_hands = hand user_hands.append(under) if shuffle is True: np.random.shuffle(user_hands) if mine_or_other2 == 1: self.hands[deck_id]["myhand"] = user_hands elif mine_or_other2 == 2: self.hands[deck_id]["otherhand"] = user_hands elif mine_or_other2 == 3: self.hands[deck_id]["commonhand"] = user_hands elif mine_or_other2 == 4: if self.user == under["owner"]: self.hands[deck_id]["myhand"] = user_hands elif other_user == under["owner"]: self.hands[deck_id]["otherhand"] = user_hands else: self.hands[deck_id]["commonhand"] = user_hands def copy_monster_to_field(self, monster, x, y, mine_or_other, variable_names): duel = self.duel monster = copy.deepcopy(monster) monster["place_unique_id"] monster["place"] = "field" monster["deck_id"] = 0 monster["x"] = x monster["y"] = y monster["mine_or_other"] = mine_or_other #monster["turncount"] = duel.turn_count if "kind" in monster: del monster["kind"] return monster def check_eternal_invalid( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1 ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 2 ) def check_no_choose( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, index=None, cost=0, ): id = self.get_monster_id(monster, place, user, deck_id, 0, 0, mine_or_other) monster_det = Monster.objects.get(id=id) eternals = monster_det.eternal_effect.all().filter( Q(eternal_effect_val=0) or Q(eternal_effect_val=3) ) place_unique_id = monster["place_unique_id"] for eternal in eternals: tmps = json.loads(eternal.eternal_monster) tmps = tmps["monster"] if eternal.eternal_effect_val != 0 and eternal.eternal_effect_val != 3: continue tmp = {} if index is not None: tmp["index"] = index tmp["eternal"] = copy.deepcopy(eternal) tmp["effect_val"] = eternal.eternal_effect_val tmp["kind"] = eternal.eternal_kind tmp["priority"] = eternal.priority tmp["user"] = user if "already" in monster: tmp["already"] = monster["already"] else: tmp["already"] = 0 tmp["place"] = place tmp["deck_id"] = deck_id tmp["x"] = x tmp["y"] = y tmp["place_unique_id"] = place_unique_id tmp["mine_or_other"] = mine_or_other self.invoke_eternal_effect_det(tmp, user) return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 1, cost ) def check_not_effected( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, cost=None, amount = 0 ): id = self.get_monster_id(monster, place, user, deck_id, 0, 0, mine_or_other) monster_det = Monster.objects.get(id=id) eternals = monster_det.eternal_effect.all().filter(eternal_effect_val=0) decks = self.deck_structure graves = self.grave_structure hands = self.hand_structure place_unique_id = monster["place_unique_id"] flag = True if not hasattr(self, "not_effected"): self.not_effected = [] elif place_unique_id in self.not_effected: flag = False else: self.not_effected.append(place_unique_id) if place == "deck": tmp_deck = decks.filter(id=deck_id).get() if tmp_deck.eternal is True: flag = False if place == "grave": tmp_deck = graves.filter(id=deck_id).get() if tmp_deck.eternal is True: flag = False if place == "hand": tmp_deck = hands.filter(id=deck_id).get() if tmp_deck.eternal is True: flag = False if flag is True: for eternal in eternals: tmp = {} tmp["eternal"] = copy.deepcopy(eternal) tmp["effect_val"] = eternal.eternal_effect_val tmp["kind"] = eternal.eternal_kind tmp["priority"] = eternal.priority tmp["user"] = user if "already" in monster: tmp["already"] = monster["already"] else: tmp["already"] = 0 tmp["place"] = place tmp["deck_id"] = deck_id tmp["place_unique_id"] = place_unique_id tmp["x"] = x tmp["y"] = y tmp["mine_or_other"] = mine_or_other self.invoke_eternal_effect_det(tmp, user) if place_unique_id in self.not_effected: self.not_effected.remove(place_unique_id) result = self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 0, cost ) tmp2 = {} tmp2["det"] = monster tmp2["mine_or_other"] = mine_or_other tmp2["user"] = user tmp2["place"] = place tmp2["deck_id"] = deck_id tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = monster["place_unique_id"] if result is True: self.raise_trigger_not_effected(tmp2, amount, cost, effect_kind, user, 1) return result def check_invoke_invalid( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 3, persist ) def check_no_invoke( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 5, persist ) def check_ignore_chain_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 8, persist ) def check_ignore_chain_user_only_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 9, persist ) def check_ignore_chain_kind_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 10, persist ) def check_ignore_same_chain_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 11, persist ) def check_ignore_same_monster_chain_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 12, persist ) def check_ignore_same_monster_exist_chain_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 13, persist ) def check_ignore_phase_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 14, persist ) def check_ignore_mine_or_other_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 15, persist ) def check_ignore_no_invoke_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 16, persist ) def check_ignore_timing_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 17, persist ) def check_ignore_turn_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 19, persist ) def check_ignore_monster_condition_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 20, persist ) def check_ignore_monster_variable_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 21, persist ) def check_ignore_monster_place_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 18, persist ) def check_ignore_monster_place_condition_func( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, persist=0, ): return self.check_eternal_det( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, 22, persist ) def check_swap_init_val( self, monster, user, place, deck_id, x, y, val_name, mine_or_other=-1, persist=0 ): tmp = self.check_eternal_det( monster, user, "-1", place, deck_id, x, y, mine_or_other, 24, persist, val_name, ) return tmp def check_swap_val( self, monster, user, place, deck_id, x, y, val_name, mine_or_other=-1, persist=0 ): tmp = self.check_eternal_det( monster, user, "-1", place, deck_id, x, y, mine_or_other, 7, persist, val_name, ) return tmp def check_change_name(self, monster, user, place, deck_id, x, y, mine_or_other=-1): return_tmp = [] return_tmp.append(monster["monster_name"]) if "eternal" in monster and monster["eternal"] is not None: for i in range(len(monster["eternal"])): if monster["eternal"][i] is None: continue if not self.check_eternal_invalid( monster, user, monster["eternal"][i]["effect_kind"], place, deck_id, x, y, mine_or_other, ): if "monster_name" in monster["eternal"][i]: if monster["eternal"][i]["monster_name"][ "add" ] == 1: return_tmp.append(monster["eternal"][i]["monster_name"]) else: return_tmp = [] return_tmp.append( monster["eternal"][i]["monster_name"]) else: del monster["eternal"][i] tmp = self.check_eternal_det( monster, user, "-1", place, deck_id, x, y, mine_or_other, 25, 0, return_tmp) if tmp != None: return_tmp = [] return_tmp.append( tmp) return_tmp = self.check_eternal_det( monster, user, "-1", place, deck_id, x, y, mine_or_other, 26, 0, return_tmp) return return_tmp def check_change_val( self, monster, user, place, deck_id, x, y, val_name, mine_or_other=-1, return_value=0,persist=0 ): if monster is None: return 0 if "eternal" in monster and monster["eternal"] is not None: for i in range(len(monster["eternal"])): if monster["eternal"][i] is None: continue if not self.check_eternal_invalid( monster, user, monster["eternal"][i]["effect_kind"], place, deck_id, x, y, mine_or_other, ): if val_name in monster["eternal"][i]["variables"]: return_tmp = monster["eternal"][i]["variables"][val_name][ "value" ] if monster["eternal"][i]["variables"][val_name][ "add" ] == 1: return_value = return_tmp elif self.is_float(return_tmp): return_value += float(return_tmp) else: return return_tmp else: del monster["eternal"][i] if place == "field": flag = True else: if place == "deck": deckobj = Deck.objects.get(id = deck_id) flag = deckobj.eternal elif place == "grave": graveobj = Grave.objects.get(id = deck_id) flag = graveobj.eternal elif place == "hand": handobj = Hand.objects.get(id = deck_id) flag = handobj.eternal else: flag = True if flag is False: id = self.get_monster_id(monster, place, user, deck_id, 0, 0, mine_or_other) monster_det = Monster.objects.get(id=id) eternals = monster_det.eternal_effect.all().filter(eternal_effect_val=1) place_unique_id = monster["place_unique_id"] for eternal in eternals: tmps = json.loads(eternal.eternal_monster) tmps = tmps["monster"] tmp = {} tmp["monster"] = monster tmp["eternal"] = copy.deepcopy(eternal) tmp["effect_val"] = eternal.eternal_effect_val tmp["kind"] = eternal.eternal_kind tmp["priority"] = eternal.priority tmp["user"] = user if "already" in monster: tmp["already"] = monster["already"] else: tmp["already"] = 0 tmp["place"] = place tmp["deck_id"] = deck_id tmp["x"] = x tmp["y"] = y tmp["place_unique_id"] = place_unique_id tmp["mine_or_other"] = mine_or_other self.invoke_eternal_effect_det(tmp, user) tmp_value = self.check_eternal_det( monster, user, "-1", place, deck_id, x, y, mine_or_other, 4, persist, val_name, ) if tmp_value is True: tmp_value = 0 if self.is_float(return_value) and self.is_float(tmp_value) and tmp_value != 0.0: return_value = float(return_value) + float(tmp_value) return return_value def check_change_dest( self, monster, user, place, deck_id, x, y, val_name, mine_or_other=-1, persist=0 ): return self.check_eternal_det( monster, user, "-1", place, deck_id, x, y, mine_or_other, 6, persist, val_name, ) def check_variable_instead( self, variable_id, mine_or_other, change_val, cost_or_effect, user, effect_kind ): return self.check_eternal_det( None, user, effect_kind, "", 0, 0, 0, mine_or_other, 23, 0, variable_id, cost_or_effect, change_val, ) def check_eternal_det( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other=-1, mode=0, persist=0, val_name=None, cost_or_effect=None, change_val2=0, ): user = int(user) if user == 1: other_user = 2 elif user == 2: other_user = 1 duel = self.duel field = self.field effect_kinds = effect_kind mine_or_other = int(mine_or_other) if monster is not None: tmp2 = {} tmp2["det"] = monster tmp2["mine_or_other"] = mine_or_other tmp2["user"] = user tmp2["place"] = place tmp2["deck_id"] = deck_id tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = monster["place_unique_id"] name_flag= False if duel.in_cost is True: chain_user = json.loads(duel.chain_user) chain_user = chain_user[str(self.tmp_chain)] elif duel.chain == 0 or duel.ask > 0: chain_user = self.user else: chain_user = json.loads(duel.chain_user) chain_user = chain_user[str(duel.chain - 1)] if mode == 0: condition = self.not_effected_eternal_effect choose = 0 elif mode == 1: condition = self.no_choose_eternal_effect choose = 0 elif mode == 2: condition = self.not_eternal_effect choose = 2 elif mode == 3: condition = self.invoke_invalid_eternal_effect choose = 2 elif mode == 4: condition = self.change_val_eternal_effect change_val = 0 choose = 2 elif mode == 25: condition = self.change_name_eternal_effect choose = 2 name_flag = True elif mode == 26: condition = self.change_name_add_eternal_effect choose = 2 name_flag = True elif mode == 5: condition = self.no_invoke_eternal_effect choose = 2 elif mode == 6: dest_flag = False condition = self.change_destination_eternal_effect change_val = 0 choose = 2 elif mode == 7: condition = self.swap_val_eternal_effect change_val = 0 choose = 2 elif mode == 8: condition = self.check_ignore_chain change_val = 0 choose = 0 elif mode == 9: condition = self.check_ignore_chain_user_only change_val = 0 choose = 0 elif mode == 10: condition = self.check_ignore_chain_kind change_val = 0 choose = 0 elif mode == 11: condition = self.check_ignore_same_chain change_val = 0 choose = 0 elif mode == 12: condition = self.check_ignore_same_monster_chain change_val = 0 choose = 0 elif mode == 13: condition = self.check_ignore_same_monster_exist_chain change_val = 0 choose = 0 elif mode == 14: condition = self.check_ignore_phase change_val = 0 choose = 0 elif mode == 15: condition = self.check_ignore_mine_or_other change_val = 0 choose = 0 elif mode == 16: condition = self.check_ignore_no_invoke change_val = 0 choose = 0 elif mode == 17: condition = self.check_ignore_timing change_val = 0 choose = 0 elif mode == 18: condition = self.check_monster_place_condition change_val = 0 choose = 0 elif mode == 19: condition = self.check_turn change_val = 0 choose = 0 elif mode == 20: condition = self.check_monster_condition_list change_val = 0 choose = 0 elif mode == 21: condition = self.check_monster_variable change_val = 0 choose = 0 elif mode == 22: condition = self.check_monster_place_condition change_val = 0 choose = 0 elif mode == 23: condition = self.take_variable_instead elif mode == 24: condition = self.swap_init_val_eternal_effect change_val = 0 choose = 2 if mode !=2: if("monster" in condition): if self.check_eternal_invalid( condition["monster"], condition["mine_or_other"], effect_kind, condition["place"], condition["deck_id"], condition["x"], condition["y"], condition["mine_or_other"], ): if mode == 4: return 0 elif mode == 25 or mode == 26: return val_name elif mode == 7 or mode == 24: return val_name elif mode == 14: return [] elif mode == 17: return [] elif mode == 21: return [] else: return False for not_effected in condition: this_monster = {} this_monster["det"] = not_effected["monster"] this_monster["mine_or_other"] = not_effected["mine_or_other"] this_monster["user"] = not_effected["user"] this_monster["place"] = not_effected["place"] this_monster["deck_id"] = not_effected["deck_id"] this_monster["x"] = not_effected["x"] this_monster["y"] = not_effected["y"] this_monster["place_unique_id"] = monster["place_unique_id"] if "place_unique_id" not in not_effected: not_effected["place_unique_id"] = "" if "tmp_val" in not_effected: self.tmp_val[not_effected["place_unique_id"]] = not_effected["tmp_val"] eternal_mine_or_other = not_effected["mine_or_other"] if persist == 1: if "persist" not in not_effected or not_effected["persist"] == 0: continue invalid_kinds = not_effected["invalid_kinds"] kind_flag = False if cost_or_effect is not None: if not_effected["cost_or_effect"] == 1 and cost_or_effect == 0: continue elif not_effected["cost_or_effect"] == 2 and cost_or_effect == 1: continue if "-1" == invalid_kinds: kind_flag = True else: if self.check_effect_kind(invalid_kinds, effect_kinds): kind_flag = True if kind_flag is False: continue place_unique_id = not_effected["place_unique_id"] eternals = not_effected["eternal"] eternal_effect = copy.deepcopy(eternals) if mode == 25 or mode == 26: eternal_values = eternal_effect.value.split("_") if mode == 4: eternal_names = eternal_effect.val_name.split("_") eternal_values = eternal_effect.value.split("_") if val_name not in eternal_names: continue val_key = eternal_names.index(val_name) if mode == 23: global_variable = eternal_effect.eternal_global_variable global_variable = global_variable.split("_") variable_name = global_variable[0] if variable_name != val_name: return 0 variable_mine_or_other = int(global_variable[1]) eternal_values = eternal_effect.value val_key = 0 if mode == 7 or mode == 24: eternal_names = eternal_effect.val_name.split("_") eternal_values = eternal_effect.value.split("_") if val_name not in eternal_names: return val_name else: val_key = eternal_names.index(val_name) swap = eternal_values[val_key] if mode == 6: # 行き先変更永続 # フィールドはうまくいかない eternal_names = json.loads(eternal_effect.val_name) eternal_values = json.loads(eternal_effect.value) val_name_det = val_name.split("_") if mine_or_other == 1: mine_or_other_other = 2 elif mine_or_other == 2: mine_or_other_other = 1 if val_name_det[2] == "4": if monster["owner"] == mine_or_other: val_name_det[2] = "1" elif monster["owner"] != mine_or_other_other: val_name_det[2] = "2" else: val_name_det[2] = "3" for eternal_name in eternal_names: eternal_name_det = eternal_name["det"].split("_") if val_name_det[0] != eternal_name_det[0]: continue if int(val_name_det[1]) != int(eternal_name_det[1]): continue if eternal_name_det[2] == val_name_det[2]: dest_flag = True if mode == 6 and dest_flag is False: continue if monster is None and eternals.invalid_none_monster: if mode == 5: return True if mode == 14: return not_effected["phases"] if mode == 17: return not_effected["timings"] if mode == 21: return not_effected["ignore_variable"] if mode == 23: if not_effected["place"] == "field": x = not_effected["x"] y = not_effected["y"] place_unique_id = not_effected["place_unique_id"] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: return 0 else: if field[x][y]["det"]["place_unique_id"] != place_unique_id: return 0 if mine_or_other == 1: if ( int(field[x][y]["mine_or_other"]) != int(variable_mine_or_other) and mine_or_other != -1 ): return 0 else: if ( int(field[x][y]["mine_or_other"]) == int(variable_mine_or_other) and mine_or_other != -1 ): return 0 monster_effect = json.loads(eternals.invalid_monster) eternal_det = monster_effect["monster"][0]["monster"] if ( "relation" in eternal_det and len(eternal_det["relation"]) != 0 ): relate_monster = not_effected["relate_monster"][0][ "monster" ] x = relate_monster["x"] y = relate_monster["y"] if self.config.sort is True: x = self.search_place_unique_id(y,relate_monster["place_unique_id"]) if x == -1: return 0 if ( relate_monster["place_unique_id"] == field[x][y]["det"]["place_unique_id"] ): if mode == 25: return eternal_values[0] elif mode == 26: for eternal_value in eternal_values: val_name.append(eternal_value) return val_name tmp3 = {} tmp3["det"] = field[x][y]["det"] tmp3["mine_or_other"] = field[x][y]["mine_or_other"] tmp3["user"] = field[x][y]["mine_or_other"] tmp3["place"] = "field" tmp3["deck_id"] = 0 tmp3["x"] = x tmp3["y"] = y tmp3["place_unique_id"] = place_unique_id change_val = min( change_val2, self.calculate_boland( eternal_effect.eternal_tmp_val, tmp3, None, True,eternal = True ), ) else: if variable_mine_or_other == 1: if ( int(field[x][y]["mine_or_other"]) != int(mine_or_other) and mine_or_other != -1 ): return 0 elif variable_mine_or_other == 2: if ( int(field[x][y]["mine_or_other"]) == int(mine_or_other) and mine_or_other != -1 ): return 0 tmp3 = {} tmp3["det"] = field[x][y]["det"] tmp3["mine_or_other"] = field[x][y]["mine_or_other"] tmp3["user"] = field[x][y]["mine_or_other"] tmp3["place"] = "field" tmp3["deck_id"] = 0 tmp3["x"] = x tmp3["y"] = y tmp3["place_unique_id"] = place_unique_id change_val = min( change_val2, self.calculate_boland( eternal_values[val_key], tmp3, None, True,eternal = True ), ) change_val_eternal = {} if "persist" in monster_effect: if monster_effect["persist"][0] is True: change_val_eternal["persist"] = True change_val_eternal["variables"] = {} change_val_eternal[ "monster_variable_change_life" ] = monster_effect["monster_variable_change_life"][0] change_val_eternal[ "monster_variable_change_life_length" ] = monster_effect["monster_variable_change_life_length"][0] change_val_eternal["effect_kind"] = monster_effect[ "monster_variable_change_effect_kind" ][0] for index in range( len(monster_effect["monster_variable_change_name"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index] if "monster_variable_change_initial" in monster_effect: ini = monster_effect[ "monster_variable_change_initial" ][index] else: ini = False if "monster_variable_change_add" in monster_effect: add = monster_effect[ "monster_variable_change_add" ][index] else: add = 0 change_val_eternal["variables"][variable_name] = {} change_val_eternal["variables"][variable_name][ "value" ] = -float(change_val) change_val_eternal["variables"][variable_name][ "ini" ] = ini change_val_eternal["variables"][variable_name][ "add" ] = add if "eternal" not in field[x][y]["det"]: field[x][y]["det"]["eternal"] = [] field[x][y]["det"]["eternal"].append(change_val_eternal) self.field = field return change_val else: return True eternal_org = eternals eternals = json.loads(eternals.invalid_monster) exclude = eternals["exclude"] eternals = eternals["monster"] mine_or_other_effect = not_effected["mine_or_other_effect"] if mine_or_other_effect == 0: pass elif mine_or_other_effect == 1: if int(not_effected["mine_or_other"]) != int(chain_user): continue elif mine_or_other_effect == 2: if int(not_effected["mine_or_other"]) == int(chain_user): continue for eternal in eternals: if exclude == "trigger": if place_unique_id == monster["place_unique_id"]: continue eternal_det = eternal["monster"] if "relation" in eternal_det and len(eternal_det["relation"]) != 0: for relate_monster in not_effected["relate_monster"]: if ( relate_monster["monster"]["place_unique_id"] == monster["place_unique_id"] ): if mode == 25: return eternal_values[0] elif mode == 26: for eternal_value in eternal_values: val_name.append( eternal_value) return val_name if mode == 4: if ( relate_monster["monster"]["mine_or_other"] == chain_user ): change_val += self.calculate_boland( eternal_values[val_key], tmp2, None, True,eternal = True ) else: change_val += self.calculate_boland( eternal_values[val_key], tmp2, True, 1, eternal = True ) elif mode == 6: return eternal_values elif mode == 7 or mode == 24: return swap elif mode == 14: return not_effected["phases"] elif mode == 17: return not_effected["timings"] elif mode == 21: return not_effected["ignore_variable"] elif mode == 23: if not_effected["global_variable"] != val_name: continue return_tmp = min( self.calculate_boland( not_effected["tmp_val"], relate_monster["monster"], eternal = True ), change_val, ) self.damage_monster( monster, not_effected["val_name"], return_tmp ) return return_tmp else: return True elif eternal["as_monster_condition"] == "trigger": if place_unique_id == monster["place_unique_id"]: if mode == 25: return eternal_values[0] elif mode == 26: for eternal_value in eternal_values: val_name.append( eternal_value) return val_name if mode == 4: if monster["mine_or_other"] == chain_user: change_val += self.calculate_boland( eternal_values[val_key], tmp2, False, 1,eternal = True ) else: change_val += self.calculate_boland( eternal_values[val_key], tmp2, True, 1,eternal = True ) elif mode == 6: return eternal_values elif mode == 7 or mode == 24: return swap elif mode == 14: return not_effected["phases"] elif mode == 17: return not_effected["timings"] elif mode == 21: return not_effected["ignore_variable"] else: return True if not eternal_det["place"]: continue for place_det in eternal_det["place"]: place_det_det = place_det["det"].split("_") place_mine_or_other = int(place_det_det[2]) if place == place_det_det[0]: if place == "field": if eternal_mine_or_other == 1: mine_or_other2 = place_mine_or_other elif eternal_mine_or_other == 2: if place_mine_or_other == 1: mine_or_other2 = 2 elif place_mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = place_mine_or_other if mine_or_other == 0 or mine_or_other == -1: pass elif mine_or_other2 != field[x][y]["mine_or_other"]: continue if self.field_free is False: kind = field[x][y]["kind"] else: kind = field[0][y]["kind"] if kind != "": kind = kind.split("_") if place_det_det[1] in kind: if self.check_monster_condition_det( eternal, monster, user, effect_kind, choose, None, 0, 0, 0, 0, 0, not_effected["place_unique_id"], monster_check = this_monster, name_flag = name_flag ): if mode == 4: if user == chain_user: change_val += self.calculate_boland( eternal_values[val_key], tmp2, None, True,eternal = True ) else: change_val += self.calculate_boland( eternal_values[val_key], tmp2, True, 1,eternal = True ) elif mode == 7 or mode == 24: return swap elif mode == 14: return not_effected["phases"] elif mode == 17: return not_effected["timings"] elif mode == 21: return not_effected["ignore_variable"] elif mode == 25: return eternal_values[0] elif mode == 26: for eternal_value in eternal_values: val_name.append( eternal_value) return val_name else: return True elif place == "under": if eternal_mine_or_other == 1: mine_or_other2 = place_mine_or_other elif eternal_mine_or_other == 2: if place_mine_or_other == 1: mine_or_other2 = 2 elif place_mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = place_mine_or_other if mine_or_other == 0 or mine_or_other == -1: pass elif mine_or_other2 != field[x][y]["mine_or_other"]: continue if self.field_free is False: kind = field[x][y]["kind"] else: kind = field[0][y]["kind"] if kind != "": kind = kind.split("_") if place_det_det[1] in kind: if self.check_monster_condition_det( eternal, monster, user, effect_kind, choose, None, 0, 0, 0, 0, 0, not_effected["place_unique_id"], monster_check = this_monster, name_flag = name_flag ): if mode == 4: if user == chain_user: change_val += self.calculate_boland( eternal_values[val_key], tmp2, None, True,eternal = True ) else: change_val += self.calculate_boland( eternal_values[val_key], tmp2, True, 1,eternal = True ) elif mode == 6: return eternal_values elif mode == 7 or mode == 24: return swap elif mode == 14: return not_effected["phases"] elif mode == 17: return not_effected["timings"] elif mode == 21: return not_effected["ignore_variable"] elif mode == 25: return eternal_values[0] elif mode == 26: for eternal_value in eternal_values: val_name.append( eternal_value) return val_name else: return True else: if int(place_det_det[1]) == int(deck_id): place_mine_or_other = int(place_det_det[2]) if int(mine_or_other) == -1: pass elif ( place_mine_or_other == 1 and mine_or_other == eternal_mine_or_other ) or ( place_mine_or_other == 2 and mine_or_other != eternal_mine_or_other ): pass else: if place_mine_or_other == 3: pass else: continue else: continue if self.check_monster_condition_det( eternal, monster, user, effect_kind, choose, place_det_det[0], place_det_det[1], 0, 0, mine_or_other, 0, not_effected["place_unique_id"], monster_check = this_monster, name_flag = name_flag ): if mode == 4: if user == chain_user: change_val += self.calculate_boland( eternal_values[val_key], tmp2, None, True ) else: change_val += self.calculate_boland( eternal_values[val_key], tmp2, True, 1 ) elif mode == 25: return eternal_values[0] elif mode == 26: for eternal_value in eternal_values: val_name.append( eternal_value) return val_name elif mode == 7 or mode == 24: return swap elif mode == 14: return not_effected["phases"] elif mode == 17: return not_effected["timings"] elif mode == 21: return not_effected["ignore_variable"] elif mode == 25: return eternal_values[0] elif mode == 26: for eternal_value in eternal_values: val_name.append( eternal_value) return val_name else: return True if mode == 4: return change_val elif mode == 25: return val_name[0] elif mode == 26: return val_name elif mode == 7 or mode == 24: return val_name elif mode == 14: return [] elif mode == 17: return [] elif mode == 21: return [] else: return False def check_monster_condition_det( self, monster_condition: object, monster: object, user: object, effect_kind="", choose=0, place=None, deck_id=0, x=0, y=0, mine_or_other=-1, cost_flag=0, eternal_place_unique_id = "", monster_check = None, name_flag = False ): #if user != self.user: # other_user_flag2 = True #else: #謎多分Falseでいいと思われる other_user_flag2 = False field = self.field if monster_check is None: monster2 = {} monster2["det"] = monster monster2["mine_or_other"] = mine_or_other monster2["user"] = user monster2["place"] = place monster2["deck_id"] = deck_id monster2["x"] = x monster2["y"] = y monster2["place_unique_id"] = monster["place_unique_id"] else: monster2 = monster_check monster_condition = monster_condition["monster"] flag = monster_condition["flag"] if (choose == 1 or choose == 3) and effect_kind != "": if self.check_no_choose( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, cost_flag, ): return False elif (choose == 2 or choose == 3) and effect_kind != "": if self.check_not_effected( monster, user, effect_kind, place, deck_id, x, y, mine_or_other, cost_flag, ): return False if "under" in monster_condition: if not self.check_under(monster_condition["under"], monster, monster2): return False if flag is not None and flag != "": flag_det = int(flag["flag_det"]) if flag["operator"] == "=": if monster["flag"] != int(flag_det): return False elif flag["operator"] == "&": if monster["flag"] & int(flag_det) == 0: return False elif flag["operator"] == "^": if monster["flag"] & int(flag_det) != 0: return False if ( "place_unique_id" in monster_condition and monster_condition["place_unique_id"] != "" ): if monster["place_unique_id"] != self.get_place_unique_id( monster_condition["place_unique_id"] ): return False if "unique_id" in monster_condition and monster_condition["unique_id"] != "": if monster["card_unique_id"] != self.get_card_unique_id( monster_condition["unique_id"] ): return False if ( "effect_valid" in monster_condition and monster_condition["effect_valid"] != "" and monster_condition["effect_valid"] is not None ): if self.check_eternal_invalid( monster, mine_or_other, str(monster_condition["effect_valid"]), place, deck_id, x, y, mine_or_other, ): return False if ( "monster_effect" in monster_condition and monster_condition["monster_effect"] != 0 and monster_condition["monster_effect"] != "0" and monster_condition["monster_effect"] != "" and monster_condition["monster_effect"] is not None ): id = self.get_monster_id(monster, place, user, deck_id, x, y, mine_or_other) monster_effect_monster_ary = str(monster_condition["monster_effect"]).split("_") monster_effect_flag = False for monster_effect_monster in monster_effect_monster_ary: if monster_effect_monster[0] == "!": if id == int(monster_effect_monster[1:]): return False else: monster_effect_flag = True elif id == int(monster_effect_monster): monster_effect_flag = True break if monster_effect_flag is False: return False monster_name_kind = monster_condition["monster_name_kind"] current_and_or = "and" if(name_flag is False): monster_names = self.check_change_name(monster, user, place, deck_id, x, y, -1) else: monster_names = [monster["monster_name"]] cond_flag = True for name_kind in monster_name_kind: if name_kind != "": tmp_flag = False for monster_name in monster_names: if name_kind["operator"] == "=": if monster_name == self.get_name( name_kind["monster_name"], 0, monster,eternal_place_unique_id ): tmp_flag = True elif name_kind["operator"] == "!=": if monster_name != self.get_name( name_kind["monster_name"], 0, monster ): tmp_flag = True elif name_kind["operator"] == "like": if ( monster_name.find( self.get_name(name_kind["monster_name"], 0, monster) ) != -1 ): tmp_flag = True else: tmp_flag = True if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: cond_flag = False else: if cond_flag is False: cond_flag = tmp_flag else: cond_flag = True current_and_or = name_kind["and_or"] if cond_flag is False: return False if ( "place" in monster_condition and monster_condition["place"] ): tmp_flag = False for place_tmp2 in monster_condition["place"]: place_det = place_tmp2["det"].split("_") if place_det[0] == "field": if monster["place"] == "field": if int(field[monster["x"]][monster["y"]]["kind"]) == int(place_det[1]): tmp_flag = True elif place_det[0] == monster["place"]: if int(place_det[1]) == int(monster["deck_id"]): tmp_flag = True else: tmp_flag = True if tmp_flag is False: return False if ( "place_from" in monster_condition and monster_condition["place_from"] is not None ): tmp_flag = False for place_from in monster_condition["place_from"]: place_from_det = place_from["place"].split("_") if place_from_det[0] == "field": if "from2" in monster and monster["from2"] == "field": if int(monster["from_field_kind"]) == int(place_from_det[1]): tmp_flag = True elif place_from_det[0] == monster["from"]: if int(place_from_det[1]) == int(monster["from_deck_id"]): tmp_flag = True else: tmp_flag = True if tmp_flag is False: return False if "turn_count" in monster_condition and monster_condition["turn_count"] != "": turn_count = monster_condition["turn_count"].split("$") pprint(monster) pprint(turn_count) monster_condition["turn_count"] = "$".join(turn_count[0:-1]) pprint(self.calculate_boland(monster_condition["turn_count"],mode=1,user=user)) if turn_count[len(turn_count)-1] == "<=": turn_count = turn_count[0:-1] monster_condition["turn_count"] = "$".join(turn_count) if self.calculate_boland(monster_condition["turn_count"],mode=1,user=user) < monster["turncount"]: return False elif turn_count[len(turn_count)-1] == ">=": turn_count = turn_count[0:-1] monster_condition["turn_count"] = "$".join(turn_count) if self.calculate_boland(monster_condition["turn_count"],mode=1,user=user) > monster["turncount"]: return False elif turn_count[len(turn_count)-1] == "!=": turn_count = turn_count[0:-1] monster_condition["turn_count"] = "$".join(turn_count) if self.calculate_boland(monster_condition["turn_count"],mode=1,user=user) == monster["turncount"]: return False elif turn_count[len(turn_count)-1] == "=": turn_count = turn_count[0:-1] monster_condition["turn_count"] = "$".join(turn_count) if self.calculate_boland(monster_condition["turn_count"],mode=1,user=user) != monster["turncount"]: return False elif self.calculate_boland(monster_condition["turn_count"],mode=1,user=user) != monster["turncount"]: return False monster_condition_val = monster_condition["field_y"] field_y_operators = monster_condition["field_y_operator"] field_y_and_or = monster_condition["field_y_and_or"] i =0 pprint("GGG") for cond_val in monster_condition_val: cond_flag = True current_and_or = "and" tmp_flag = True if not cond_val: continue value = monster["y"] if field_y_operators[i] == "=": if float(value) != self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode = 1 ): tmp_flag = False elif field_y_operators[i] == "": values = str(value).split("_") for index in range(len(values)): values[index] = int(float(values[index])) if int(cond_val) not in values: tmp_flag = False elif field_y_operators[i] == "!==": values = str(value).split("_") for index in range(len(values)): values[index] = int(float(values[index])) if int(cond_val) in values: tmp_flag = False elif field_y_operators[i] == "<=": if float(value) > self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode =1 ): tmp_flag = False elif field_y_operators[i] == ">=": if float(value) < self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode = 1 ): tmp_flag = False elif field_y_operators[i] == "!=": if float(value) == self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode = 1 ): tmp_flag = False if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: cond_flag = False else: if cond_flag is False: cond_flag = tmp_flag else: cond_flag = True current_and_or = field_y_and_or[i] tmp_flag = True i+=1 if cond_flag is False: return False monster_condition_val = monster_condition["field_x"] field_x_operators = monster_condition["field_x_operator"] field_x_and_or = monster_condition["field_x_and_or"] pprint("XXX") i =0 for cond_val in monster_condition_val: cond_flag = True current_and_or = "and" tmp_flag = True if not cond_val: continue value = monster["x"] if field_x_operators[i] == "=": if float(value) != self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode = 1 ): tmp_flag = False elif field_x_operators[i] == "": values = str(value).split("_") for index in range(len(values)): values[index] = int(float(values[index])) if int(cond_val) not in values: tmp_flag = False elif field_x_operators[i] == "!==": values = str(value).split("_") for index in range(len(values)): values[index] = int(float(values[index])) if int(cond_val) in values: tmp_flag = False elif field_x_operators[i] == "<=": if float(value) > self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode = 1 ): tmp_flag = False elif field_x_operators[i] == ">=": if float(value) < self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode = 1 ): tmp_flag = False elif field_x_operators[i] == "!=": if float(value) == self.calculate_boland( cond_val, monster2, False,other_user_flag2 = other_user_flag2,user =user,mode = 1 ): tmp_flag = False if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: cond_flag = False else: if cond_flag is False: cond_flag = tmp_flag else: cond_flag = True current_and_or = field_x_and_or[i] tmp_flag = True i+=1 if cond_flag is False: return False monster_condition_val = monster_condition["monster_condition"] pprint("III") for cond_det in monster_condition_val: cond_flag = True current_and_or = "and" tmp_flag = True for cond_val in cond_det: if not cond_val: continue name = self.check_swap_val( monster, user, place, deck_id, x, y, cond_val["name"], -1 ) name2 = self.check_swap_init_val( monster, user, place, deck_id, x, y, cond_val["name"], -1 ) tmp = monster["variables"][name2] pprint(cond_val) if not cond_val["num"].isnumeric() and not self.special_val(cond_val["num"]): value = self.check_change_val( monster, user, place, deck_id, x, y, name, mine_or_other,tmp["value"]) if value.isnumeric(): if cond_val["operator"] == "!=": tmp_flag = True else: tmp_flag = False if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: cond_flag = False else: if cond_flag is True: cond_flag = True else: cond_flag = tmp_flag current_and_or = cond_val["and_or"] continue else: if cond_val["operator"] == "=": if value == cond_val["num"]: tmp_flag = True else: tmp_flag = False elif cond_val["operator"] == "": values = value.split("_") if cond_val["num"] in values: tmp_flag = True else: tmp_flag = False elif cond_val["operator"] == "!=": if value == cond_val["num"]: tmp_flag = False else: tmp_flag = True if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: cond_flag = False else: if cond_flag is True: cond_flag = True else: cond_flag = tmp_flag current_and_or = cond_val["and_or"] continue if not tmp["value"].isnumeric(): value = self.check_change_val( monster, user, place, deck_id, x, y, name, mine_or_other,tmp["value"]) if cond_val["operator"] == "!=": if cond_val["num"] == value["value"]: tmp_flag = False else: tmp_flag = True elif cond_val["operator"] == "": values = value.split("_") if cond_val["num"] in values: tmp_flag = True else: tmp_flag = False elif cond_val["operator"] != "=": tmp_flag = False else: if cond_val["num"] == value: tmp_flag = True else: tmp_flag = False if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: cond_flag = False else: if cond_flag is False: cond_flag = tmp_flag else: cond_flag = True current_and_or = cond_val["and_or"] continue if cond_val["init"] == 0: value = self.check_change_val( monster, user, place, deck_id, x, y, name, mine_or_other,int(tmp["value"]) ) elif cond_val["init"] == 1: value = tmp["i_val"] elif cond_val["init"] == 2: value = tmp["i_i_val"] if tmp["minus"] is False and float(value) < 0: value = 0 if cond_val["operator"] == "=": if float(value) != self.calculate_boland( cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,user =user ): tmp_flag = False elif cond_val["operator"] == "": values = str(value).split("_") for index in range(len(values)): values[index] = int(float(values[index])) if int(cond_val["num"]) not in values: tmp_flag = False elif cond_val["operator"] == "!==": values = str(value).split("_") for index in range(len(values)): values[index] = int(float(values[index])) if int(cond_val["num"]) in values: tmp_flag = False elif cond_val["operator"] == "<=": if float(value) > self.calculate_boland( cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,user =user ): tmp_flag = False elif cond_val["operator"] == ">=": if float(value) < self.calculate_boland( cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,user =user ): tmp_flag = False elif cond_val["operator"] == "!=": if float(value) == self.calculate_boland( cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,user =user ): tmp_flag = False if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: cond_flag = False else: if cond_flag is False: cond_flag = tmp_flag else: cond_flag = True current_and_or = cond_val["and_or"] tmp_flag = True if cond_flag is False: return False pprint("JJJ") if "relation" in monster_condition: relation_condition = monster_condition["relation"] else: relation_condition = [] cond_flag = True current_and_or = "and" for index in range(len(relation_condition)): relation_name = monster_condition["relation"][index] if "relation_id" in monster_condition: relate_monster = monster_condition["relation_id"][index] else: relate_monster = "" relation_to = int(monster_condition["relation_to"][index]) relation_kind = monster_condition["relation_kind"][index] if "relation_valid" in monster_condition: relate_valid = monster_condition["relation_valid"][index] else: relate_valid = "" if relation_name == "-2": tmp_flag = True else: tmp_flag = False if "rel" not in monster: if relation_name == "-2": if current_and_or == "and": pass else: cond_flag = True continue else: return False rel_det = monster["rel"] if relation_kind in monster["rel"]: for relation_det in rel_det[relation_kind]: if relate_valid != "": rel_monster_det = relation_det["monster"] monster2 = self.get_monster( rel_monster_det["place"], rel_monster_det["place_unique_id"], rel_monster_det["mine_or_other"], rel_monster_det["user"], rel_monster_det["deck_id"], rel_monster_det["x"], rel_monster_det["y"], ) if self.check_eternal_invalid( monster2["det"], monster2["user"], relate_valid, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], ): tmp_flag = False break if relation_to == -1 or relation_to == int(relation_det["to"]): if relation_name == "-2": tmp_flag = False break elif ( relation_name == "-1" or relation_name == "" or relation_name == relation_det["name"] ): if relate_monster == "" or int( relate_monster ) == self.get_monster_id_easy( relation_det["monster"]["det"] ): tmp_flag = True break if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: if cond_flag is False: cond_flag = tmp_flag current_and_or = "and" if cond_flag is False: return False custom_monster_condition = monster_condition["custom_monster_condition"] pprint("KKK") for cond_det in custom_monster_condition: cond_flag = True current_and_or = "and" tmp_flag = True for cond_val in cond_det: if not cond_val: continue name = self.check_swap_val( monster, user, place, deck_id, x, y, cond_val["name"], -1 ) value = self.check_change_val( monster, user, place, deck_id, x, y, name, -1 ) value = float(value) if cond_val["operator"] == "=" or cond_val["operator"] == "": if str(value) != str( self.calculate_boland(cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,mode = 1,user =user) ): tmp_flag = False elif cond_val["operator"] == "<=": if int(value) > self.calculate_boland( cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,mode = 1,user =user ): tmp_flag = False elif cond_val["operator"] == ">=": if int(value) < self.calculate_boland( cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,mode = 1,user =user ): tmp_flag = False elif cond_val["operator"] == "!=": if int(value) == self.calculate_boland( cond_val["num"], monster2, False,other_user_flag2 = other_user_flag2,mode = 1,user =user ): tmp_flag = False if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: if cond_flag is False: cond_flag = tmp_flag current_and_or = cond_val["and_or"] tmp_flag = True if cond_flag is False: return False pprint("KKK") return True def check_monster_condition( self, monster_conditions, user, cost_or_effect=False, monster=None, excludes=False, choose=0, effect_kind="", name_flag = False ): #if user != self.user: # other_user_flag2 = True #else: #謎多分Falseでいいと思われる other_user_flag2 = False choose = int(choose) duel = self.duel cost = self.cost mess = self.mess if str(self.tmp_chain) in cost: cost = cost[str(self.tmp_chain)] else: cost = [] if str(duel.chain - 1) in mess: mess = mess[str(duel.chain - 1)] else: mess = [] timing_mess = self.timing_mess field = self.field actual_flag = False and_or_all = "and" flag = True for monster_condition in monster_conditions: as_flag = False count = 0 variety = [] same_name = {} variable_variety = [] variable_counter = 0 counter = -1 x_counter = 0 y_counter = 0 exclude_flag = False equation_kind = monster_condition["equation"]["equation_kind"] if equation_kind == "x": counter = "x" elif equation_kind == "y": counter = "y" elif ( equation_kind != "number" and equation_kind != "kind" and equation_kind != "same_name" ): counter = equation_kind place = monster_condition["monster"]["place"] if monster_condition["as_monster_condition"]: actual_flag = True as_flag = True as_monsters = monster_condition["as_monster_condition"].split(",") for as_monster in as_monsters: if as_monster[0] != "~" and as_monster[0] != "%": tmp = self.mess if as_monster not in tmp[str(duel.chain - 1)]: continue monsters = tmp[str(duel.chain - 1)][as_monster] elif as_monster[0] == "-": tmp = self.mess tmp = tmp[str(int(duel.chain - 2))] if as_monster not in tmp[str(duel.chain - 2)]: continue monsters = tmp[as_monster] elif as_monster[0] == "%": tmp = self.timing_mess if as_monster not in tmp: continue monsters = tmp[as_monster] elif as_monster[0] == "~": tmp = self.cost if duel.in_cost is True: if as_monster not in tmp[str(self.tmp_chain)]: continue monsters = tmp[str(self.tmp_chain)][as_monster] else: if as_monster not in tmp[str(duel.chain - 1)]: continue monsters = tmp[str(duel.chain - 1)][as_monster] for monster2 in monsters: if monster2["place"] == "field": if field[monster2["x"]][monster2["y"]]["det"] is None: continue if ( field[monster2["x"]][monster2["y"]]["det"][ "place_unique_id" ] != monster2["place_unique_id"] ): continue if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det == "#trigger": if ( field[monster2["x"]][monster2["y"]][ "det" ]["place_unique_id"] == monster["place_unique_id"] ): exclude_flag = True break if exclude_det in cost: for cost_det in cost[exclude_det]: if ( field[monster2["x"]][monster2["y"]][ "det" ]["place_unique_id"] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[ exclude_det ]: if ( field[monster2["x"]][ monster2["y"] ]["det"]["place_unique_id"] == timing_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det in mess: for mess_det in mess[exclude_det]: if ( field[monster2["x"]][monster2["y"]][ "det" ]["place_unique_id"] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False continue elif monster2["place"] == "deck": flag = False deck_id = monster2["deck_id"] mine_or_other = int(monster2["mine_or_other"]) if 1 == self.user: mine_or_other2 = mine_or_other else: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other if mine_or_other2 == 1: deck = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: deck = self.decks[deck_id]["otherdeck"] elif mine_or_other2 == 3: deck = self.decks[deck_id]["commondeck"] for tmp in deck: if ( tmp["place_unique_id"] == monster2["place_unique_id"] ): if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost[exclude_det]: if ( tmp["place_unique_id"] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[ exclude_det ]: if ( tmp["place_unique_id"] == timing_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det in mess: for mess_det in mess[exclude_det]: if ( tmp["place_unique_id"] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False break flag = True break if flag is False: continue elif monster2["place"] == "grave": flag = False deck_id = monster2["deck_id"] mine_or_other = int(monster2["mine_or_other"]) if 1 == self.user: mine_or_other2 = mine_or_other else: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other if mine_or_other2 == 1: grave = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: grave = self.graves[deck_id]["othergrave"] elif mine_or_other2 == 3: grave = self.graves[deck_id]["commongrave"] for tmp in grave: if ( tmp["place_unique_id"] == monster2["place_unique_id"] ): if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost[exclude_det]: if ( tmp["place_unique_id"] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[ exclude_det ]: if ( tmp["place_unique_id"] == timing_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det in mess: for mess_det in mess[exclude_det]: if ( tmp["place_unique_id"] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False break flag = True break if flag is False: continue elif monster2["place"] == "hand": flag = False deck_id = monster2["deck_id"] mine_or_other = int(monster2["mine_or_other"]) if 1 == self.user: mine_or_other2 = mine_or_other else: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other if mine_or_other2 == 1: hand = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: hand = self.hands[deck_id]["otherhand"] elif mine_or_other2 == 3: hand = self.hands[deck_id]["commonhand"] for tmp in hand: if ( tmp["place_unique_id"] == monster2["place_unique_id"] ): if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost[exclude_det]: if ( tmp["place_unique_id"] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[ exclude_det ]: if ( tmp["place_unique_id"] == timing_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det in mess: for mess_det in mess[exclude_det]: if ( tmp["place_unique_id"] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False break flag = True break if flag is False: continue if ( self.check_monster_condition_det( monster_condition, monster2["det"], user, effect_kind, choose, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], monster_check = monster, name_flag = name_flag ) is True ): if counter == "x": x_counter += monster2["x"] elif counter == "y": y_counter += monster2["y"] elif counter != -1: variable = monster2["det"]["variables"][counter][ "value" ] tmp_varieties = variable.split("_") for tmp_variety in tmp_varieties: variable_variety.append(tmp_variety) variable_counter += int(variable["value"]) if monster2["det"]["id"] not in variety: variety.append(monster2["det"]["id"]) if monster2["det"]["monster_name"] not in same_name: same_name[monster2["det"]["monster_name"]] = 0 same_name[monster2["det"]["monster_name"]] += 1 count += 1 if place and as_flag is False: actual_flag = True for place_tmp in place: place_tmp = place_tmp["det"].split("_") deck_id = place_tmp[1] mine_or_other = int(place_tmp[2]) if (user == 1 and mine_or_other == 1) or ( user == 2 and mine_or_other == 2 ): mine_or_other = 1 elif (user == 1 and mine_or_other == 2) or ( user == 2 and mine_or_other == 1 ): mine_or_other = 2 else: mine_or_other = 3 if place_tmp[0] == "field": if mine_or_other == 3: mine_or_other = 0 field = self.field for x in range(len(field)): for y in range(len(field[x])): if self.field_free is False: kind = field[x][y]["kind"] else: kind = field[0][y]["kind"] mine_or_other_field = field[x][y]["mine_or_other"] # if user != 1: # if mine_or_other_field ==1: # mine_or_other_field = 2 # elif mine_or_other_field ==2: # mine_or_other_field = 1 if kind != "": tmp = kind.split("_") else: tmp = [] tmp.append("99999") if ( deck_id in tmp and mine_or_other == mine_or_other_field ): if ( "det" in field[x][y] and field[x][y]["det"] is not None ): if ( self.check_monster_condition_det( monster_condition, field[x][y]["det"], user, effect_kind, choose, "field", None, x, y, field[x][y]["mine_or_other"], monster_check = monster, name_flag = name_flag ) is True ): if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det == "#trigger": if ( field[x][y][ "det" ]["place_unique_id"] == monster["place_unique_id"] ): exclude_flag = True break if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost[ exclude_det ]: if ( field[x][y]["det"][ "place_unique_id" ] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if ( exclude_det in timing_mess ): for ( timing_det ) in timing_mess[ exclude_det ]: if ( field[x][y][ "det" ][ "place_unique_id" ] == timing_det[ "det" ][ "place_unique_id" ] ): exclude_flag = ( True ) break if exclude_det in mess: for mess_det in mess[ exclude_det ]: if ( field[x][y]["det"][ "place_unique_id" ] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False continue count += 1 if field[x][y]["det"]["id"] not in variety: variety.append(field[x][y]["det"]["id"]) if ( field[x][y]["det"]["monster_name"] not in same_name ): same_name[ field[x][y]["det"]["monster_name"] ] = 0 same_name[ field[x][y]["det"]["monster_name"] ] += 1 if counter == "x": x_counter += x if counter == "y": y_counter += y if counter != -1: variable = field[x][y]["det"][ "variables" ][counter] tmp_varieties = variable["value"].split( "_" ) for tmp_variety in tmp_varieties: if ( tmp_variety not in variable_variety ): variable_variety.append( tmp_variety ) variable_counter += int( variable["value"] ) if (place_tmp[2] == "1" and user == self.user) or ( place_tmp[2] == "2" and user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and user != self.user) or ( place_tmp[2] == "2" and user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if (place_tmp[2] == "1" and user == 1) or ( place_tmp[2] == "2" and user != 1 ): mine_or_other3 = 1 elif (place_tmp[2] == "1" and user != 1) or ( place_tmp[2] == "2" and user == 1 ): mine_or_other3 = 2 else: mine_or_other3 = 3 if place_tmp[0] == "deck": deck_id = int(deck_id) if mine_or_other2 == 1: deck = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: deck = self.decks[deck_id]["otherdeck"] elif mine_or_other2 == 3: deck = self.decks[deck_id]["commondeck"] for j in range(len(deck)): if ( self.check_monster_condition_det( monster_condition, deck[j], user, effect_kind, choose, "deck", deck_id, 0, 0, mine_or_other3, monster_check = monster, name_flag = name_flag ) is True ): if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det == "#trigger": if ( deck[j]["place_unique_id"] == monster["place_unique_id"] ): exclude_flag = True break if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost[exclude_det]: if ( deck[j]["place_unique_id"] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[ exclude_det ]: if ( deck[j]["place_unique_id"] == timing_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det in mess: for mess_det in mess[exclude_det]: if ( deck[j]["place_unique_id"] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False continue if deck[j]["id"] not in variety: variety.append(deck[j]["id"]) if deck[j]["monster_name"] not in same_name: same_name[deck[j]["monster_name"]] = 0 same_name[deck[j]["monster_name"]] += 1 count += 1 if counter != -1: variable = deck[j]["variables"][counter] tmp_varieties = variable["value"].split("_") for tmp_variety in tmp_varieties: if tmp_variety not in variable_variety: variable_variety.append(tmp_variety) variable_counter += int(variable["value"]) if place_tmp[0] == "grave": deck_id = int(deck_id) if mine_or_other2 == 1: grave = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: grave = self.graves[deck_id]["othergrave"] elif mine_or_other2 == 3: grave = self.graves[deck_id]["commongrave"] for j in range(len(grave)): if ( self.check_monster_condition_det( monster_condition, grave[j], user, effect_kind, choose, "grave", deck_id, 0, 0, mine_or_other3, monster_check = monster, name_flag = name_flag ) is True ): if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det == "#trigger": if ( grave[j]["place_unique_id"] == monster["place_unique_id"] ): exclude_flag = True break if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost["det"][ exclude_det ]: if ( grave[j]["place_unique_id"] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[ exclude_det ]: if ( grave[j]["place_unique_id"] == timing_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det in mess: for mess_det in mess[exclude_det]: if ( grave[j]["place_unique_id"] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False continue if grave[j]["id"] not in variety: variety.append(grave[j]["id"]) if grave[j]["monster_name"] not in same_name: same_name[grave[j]["monster_name"]] = 0 same_name[grave[j]["monster_name"]] += 1 count += 1 if counter != -1: variable = grave[j]["variables"][counter] tmp_varieties = variable["value"].split("_") for tmp_variety in tmp_varieties: if tmp_variety not in variable_variety: variable_variety.append(tmp_variety) variable_counter += int(variable["value"]) if place_tmp[0] == "hand": deck_id = int(deck_id) if mine_or_other2 == 1: hand = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: hand = self.hands[deck_id]["otherhand"] elif mine_or_other2 == 3: hand = self.hands[deck_id]["commonhand"] for j in range(len(hand)): if ( self.check_monster_condition_det( monster_condition, hand[j], user, effect_kind, choose, "hand", deck_id, 0, 0, mine_or_other3, monster_check = monster, name_flag = name_flag ) is True ): if excludes: exclude_flag = False for exclude_det in excludes: if exclude_flag is True: break if exclude_det == "#trigger": if ( hand[j]["place_unique_id"] == monster["place_unique_id"] ): exclude_flag = True break if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost[exclude_det]: if ( hand[j]["place_unique_id"] == cost_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[ exclude_det ]: if ( hand[j]["place_unique_id"] == timing_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_det in mess: for mess_det in mess[exclude_det]: if ( hand[j]["place_unique_id"] == mess_det["det"][ "place_unique_id" ] ): exclude_flag = True break if exclude_flag is True: exclude_flag = False continue if hand[j]["id"] not in variety: variety.append(hand[j]["id"]) if hand[j]["monster_name"] not in same_name: same_name[hand[j]["monster_name"]] = 0 same_name[hand[j]["monster_name"]] += 1 count += 1 if counter != -1: variable = hand[j]["variables"][counter] tmp_varieties = variable["value"].split("_") for tmp_variety in tmp_varieties: if tmp_variety not in variable_variety: variable_variety.append(tmp_variety) variable_counter += int(variable["value"]) min_equation_number = monster_condition["min_equation_number"] max_equation_number = monster_condition["max_equation_number"] if equation_kind == "number": if count >= float(self.calculate_boland( min_equation_number, monster,other_user_flag2 = other_user_flag2,user =user )) and count <= float(self.calculate_boland(max_equation_number, monster,other_user_flag2 = other_user_flag2,user =user)): if and_or_all == "or": flag = True elif flag is True: flag = True else: if and_or_all == "and": flag = False elif flag is False: flag = False elif equation_kind == "kind": if len(variety) >= self.calculate_boland( min_equation_number, monster,other_user_flag2 = other_user_flag2,user =user ) and len(variety) <= self.calculate_boland( max_equation_number, monster,other_user_flag2 = other_user_flag2,user =user ): if and_or_all == "or": flag = True elif flag is True: flag = True else: if and_or_all == "and": flag = False elif flag is False: flag = False elif equation_kind == "same_name": if same_name: same_name_max = max(same_name.values()) else: same_name_max = 0 if ( same_name and same_name_max >= self.calculate_boland(min_equation_number, monster,other_user_flag2 = other_user_flag2,user =user) and same_name_max <= self.calculate_boland(max_equation_number, monster,other_user_flag2 = other_user_flag2,user =user) ): if and_or_all == "or": flag = True elif flag is True: flag = True else: if and_or_all == "and": flag = False elif flag is False: flag = False elif counter == "x": if x_counter >= self.calculate_boland( min_equation_number, monster,other_user_flag2 = other_user_flag2,user =user ) and x_counter <= self.calculate_boland(max_equation_number, monster,other_user_flag2 = other_user_flag2,user =user): if and_or_all == "or": flag = True elif flag is True: flag = True else: if and_or_all == "and": flag = False elif flag is False: flag = False elif counter == "y": if y_counter >= self.calculate_boland( min_equation_number, monster,other_user_flag2 = other_user_flag2,user =user ) and y_counter <= self.calculate_boland(max_equation_number, monster,other_user_flag2 = other_user_flag2,user =user): if and_or_all == "or": flag = True elif flag is True: flag = True else: if and_or_all == "and": flag = False elif flag is False: flag = False else: if len(variable_variety) >= self.calculate_boland( min_equation_number, monster,other_user_flag2 = other_user_flag2,user =user ) and len(variable_variety) <= self.calculate_boland( max_equation_number, monster,other_user_flag2 = other_user_flag2,user =user ): if and_or_all == "or": flag = True elif flag is True: flag = True else: if and_or_all == "and": flag = False elif flag is False: flag = False if "and_or" in monster_condition: and_or_all = monster_condition["and_or"] else: and_or_all = "and" # monsterが条件にない場合 if actual_flag is False: return True return flag def check_eternal_effect_monster(self, eternal_effect, user, monster=0): if eternal_effect.eternal_effect_monster == "": return True eternal_effect_monster = json.loads(eternal_effect.eternal_effect_monster) eternal_effect_monster_condition = eternal_effect_monster[0] place = eternal_effect_monster[0]["place"] if "flag" in eternal_effect_monster: flag = eternal_effect_monster["flag"] else: flag = None if ( self.check_eternal_effect_monster_det( place, flag, eternal_effect_monster_condition, monster, user ) is False ): return False return True def check_trigger_monster(self, trigger, user, monster=0,move_from=0): if trigger.trigger_monster == "": return True if ( self.check_trigger_monster_det( trigger.trigger_monster, monster, user, trigger,move_from ) is False ): pprint(trigger) return False return True def check_eternal_effect_monster_det( self, places, flag_det, eternal_effect_monster_condition, monster, user ): if user == 1: user = 1 else: user = 2 monster_place = monster["place"] flag = False for place_tmp in places: place_tmp = place_tmp.split("_") place = place_tmp[0] if place == monster_place: if str(monster["deck_id"]).find(place_tmp[1]) == -1: continue if ( place_tmp[2] == "1" and user == self.user or place_tmp[2] == "2" and user != self.user ): if int(monster["mine_or_other"]) != 1: continue else: if int(monster["mine_or_other"]) != 2: continue flag = True break if flag is False: return False if self.check_monster_condition_det( eternal_effect_monster_condition["monster_monster"], monster["det"], user, "", 0, monster["place"], monster["deck_id"], monster["x"], monster["y"], monster["mine_or_other"], ): return True else: return False def unique_fusion_effect(self): duel = self.duel tmp = self.mess chain_user = json.loads(duel.chain_user) user = int(chain_user[str(duel.chain-1)]) if str(duel.chain - 1) not in tmp: tmp[str(duel.chain - 1)] = {} place1 = tmp[str(duel.chain - 1)]["fusion"] place = place1[0] if duel.is_ai is True and user == 2: fusion = Fusion.objects.get(id=place["fusion"]["id"]) else: fusion = Fusion.objects.get(id=place["fusion"]) return fusion.unique_effect def get_fusion_material(self,monster_effect,user,trigger,mode=0,effect_flag = 0,strategy = "",strategy_up_or_down =""): duel = self.duel tmp = self.mess if str(duel.chain - 1) not in tmp: tmp[str(duel.chain - 1)] = {} place1 = tmp[str(duel.chain - 1)]["fusion"] place = place1[0] if trigger.instead_condition: instead_condition = json.loads(trigger.instead_condition) if self.check_monster_effect_condition( instead_condition, 0, 2): instead = True else: instead = False else: instead = True trigger_fusion1 = json.loads(trigger.fusion1) if(trigger.instead1): instead1 = json.loads(trigger.instead1) else: instead1 = None if(trigger.fusion2): trigger_fusion2 = json.loads(trigger.fusion2) else: trigger_fusion2 = None if(trigger.instead2): instead2 = json.loads(trigger.instead2) else: instead2 = None if(trigger.fusion3): trigger_fusion3 = json.loads(trigger.fusion3) else: trigger_fusion3 = None if(trigger.instead3): instead3 = json.loads(trigger.instead3) else: instead3 = None monster_id = self.get_monster_id( place["det"], place["place"], place["det"]["owner"],place["deck_id"],place["x"], place["y"], place["mine_or_other"]) if user == 2 and duel.is_ai is True: fusion = Fusion.objects.get(id=place["fusion"]["id"]) else: fusion = Fusion.objects.get(id=place["fusion"]) fusion1 = json.loads(fusion.fusion1) if(fusion.fusion2): fusion2 = json.loads(fusion.fusion2) else: fusion2 = None if(fusion.fusion3): fusion3 = json.loads(fusion.fusion3) else: fusion3 = None if fusion1: fusion_monster1 = self.check_fusion_monster_det(trigger_fusion1,fusion1,instead1,fusion,user,mode = mode,effect_flag = effect_flag,strategy = strategy,strategy_up_or_down = strategy_up_or_down) else: fusion_monster1 = {} fusion_monster1["max"] = 0 fusion_monster1["min"] = 0 fusion_monster1["monster"] = [] if fusion2: fusion_monster2 = self.check_fusion_monster_det(trigger_fusion2,fusion2,instead2,fusion,user,mode = mode,effect_flag = effect_flag,strategy = strategy,strategy_up_or_down = strategy_up_or_down) else: fusion_monster2 = {} fusion_monster2["max"] = 0 fusion_monster2["min"] = 0 fusion_monster2["monster"] = [] if fusion3: fusion_monster3 = self.check_fusion_monster_det(trigger_fusion3,fusion3,instead3,fusion,user,mode = mode,effect_flag = effect_flag,strategy = strategy,strategy_up_or_down = strategy_up_or_down) else: fusion_monster3 = {} fusion_monster3["max"] = 0 fusion_monster3["min"] = 0 fusion_monster3["monster"] = [] ary = [fusion_monster1,fusion_monster2,fusion_monster3] if mode == 0: if fusion_monster1 is False or fusion_monster2 is False or fusion_monster3 is False: return False else: return True return ary def get_fusion_monster( self, fusion_monster_condition, user, trigger,mode = 0,effect_flag = 0,strategy = "" ): duel = self.duel effect_kind = trigger.trigger_kind return_monster = [] tmp2 = json.loads(fusion_monster_condition) fusion_monster_condition = tmp2 exclude = fusion_monster_condition["exclude"] tmp2 = tmp2["monster"] monster_effect_det2 = tmp2[0] tmp_deck = None if effect_flag == 1: minus_chain = -1 else: minus_chain = 0 for tmps in tmp2: places = tmps["monster"]["place"] for place in places: place_tmp = place["det"].split("_") deck_id = int(place_tmp[1]) if place_tmp[0] == "deck": chain_user2 = json.loads(duel.chain_user) effect_user = chain_user2[str(duel.chain + minus_chain )] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["mydeck"], monster_effect_det2, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["otherdeck"], monster_effect_det2, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.decks[deck_id]["otherdeck"] else: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["commondeck"], monster_effect_det2, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.decks[deck_id]["commondeck"] deck_name = self.decks[deck_id]["deck_name"] user_decks = org_deck elif place_tmp[0] == "grave": chain_user2 = json.loads(duel.chain_user) effect_user = chain_user2[str(duel.chain + minus_chain )] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_grave_with_effect( self.graves[deck_id]["mygrave"], monster_effect_det2, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: tmp_deck = self.get_grave_with_effect( self.graves[deck_id]["othergrave"], monster_effect_det2, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.graves[deck_id]["othergrave"] else: tmp_deck = self.get_grave_with_effect( self.decks[grave_id]["commondeck"], monster_effect_det2, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.graves[deck_id]["commongrave"] deck_name = self.graves[deck_id]["grave_name"] user_decks = org_deck elif place_tmp[0] == "hand": chain_user2 = json.loads(duel.chain_user) effect_user = chain_user2[str(duel.chain + minus_chain )] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_hand_with_effect( self.hands[deck_id]["myhand"], monster_effect_det2, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: tmp_deck = self.get_hand_with_effect( self.hands[deck_id]["otherhand"], monster_effect_det2, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.hands[deck_id]["otherhand"] else: tmp_deck = self.get_hand_with_effect( self.decks[hand_id]["commondeck"], monster_effect_det2, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other, 0, ) org_deck = self.hands[deck_id]["commonhand"] deck_name = self.hands[deck_id]["hand_name"] user_decks = org_deck elif place_tmp[0] == "field": field = self.field tmp_deck = False field_tmp.append(place_tmp[1]) if place["and_or"] == "and": continue else: field_tmp2 = field_tmp field_tmp = [] effect_user = chain_user if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user == 2 ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user == 2) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other2 = 2 else: mine_or_other2 = 3 for x in range(len(field)): for y in range(len(field[x])): exclude = "" field_kind_flag = True if self.field_free is False: kind = field[x][y]["kind"] else: kind = field[0][y]["kind"] if kind != "": tmp = kind.split("_") for kind in field_tmp2: if kind not in tmp: field_kind_flag = False break if field_kind_flag is False: continue if field[x][y]["mine_or_other"] != mine_or_other2: continue if field[x][y]["det"] is None: continue fusion_monster = {} if strategy != "": if strategy in field[x][y]["det"]["variables"]: tmp_variable = field[x][y]["det"]["variables"][strategy] if not tmp_variable["value"].isnumeric(): tmp_variable["value"] = 0 else: tmp_variable = {} tmp_variable["value"] = 0 value = self.check_change_val( field[x][y]["det"], user, "field", 0, x, y, strategy, mine_or_other, int(tmp_variable["value"]) ) else: value = 0 fusion_monster["det"] = field[x][y]["det"] fusion_monster["mine_or_other"] = field[x][y]["mine_or_other"] fusion_monster["user"] = chain_user fusion_monster["place"] = "field" fusion_monster["deck_id"] = 0 fusion_monster["x"] = x fusion_monster["y"] = y fusion_monster["strategy_value"] = value fusion_monster["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] exclude = fusion_monster_condition["exclude"] if self.validate_answer( fusion_monster, fusion_monster_condition["monster"], exclude, duel ): fusions = self.check_fusion_monster(fusion_monster,trigger,user,effect_flag = effect_flag) if fusions: if mode == 1: return True for fusion in fusions: fusion_monster["fusion"] = fusion return_monster.append(fusion_monster) if not tmp_deck: continue for tmp_fusion_monster in tmp_deck: if strategy != "": tmptmpdeck = org_deck[tmp_fjusion_monster] if strategy in tmptmpdeck["variables"]: tmp_variable = tmptmpdeck["variables"][strategy] if not tmp_variable["value"].isnumeric(): tmp_variable["value"] = 0 else: tmp_variable = {} tmp_variable["value"] = 0 value = self.check_change_val( tmptmpdeck, user, place_tmp[0], deck_id, 0, 0, strategy, mine_or_other, int(tmp_variable["value"]) ) else: value = 0 fusion_monster = {} fusion_monster["det"] = org_deck[tmp_fusion_monster] fusion_monster["mine_or_other"] = mine_or_other fusion_monster["user"] = user fusion_monster["place"] = place_tmp[0] fusion_monster["deck_id"] = deck_id fusion_monster["deck_name"] = deck_name fusion_monster["x"] = 0 fusion_monster["y"] = 0 fusion_monster["place_unique_id"] = org_deck[tmp_fusion_monster][ "place_unique_id" ] fusion_monster["strategy_value"] = value exclude = fusion_monster_condition["exclude"] if self.validate_answer( fusion_monster, fusion_monster_condition["monster"][0]["monster"], exclude, duel ): fusions = self.check_fusion_monster(fusion_monster,trigger,user,effect_flag = effect_flag) if fusions: if mode == 1: return True for fusion in fusions: fusion_monster["fusion"] = fusion return_monster.append(fusion_monster) fusion_monster =copy.deepcopy(fusion_monster) if mode == 1: return False return return_monster def validate_place(self,monster_condition,monster,user): monster_place = monster["place"] tmp2 = monster_condition["monster"] flag = True for tmps in tmp2: current_and_or = "and" places = tmps["monster"]["place"] if places is None: return flag for place_tmp in places: place = place_tmp["det"] and_or = place_tmp["and_or"] place_tmp = place.split("_") flag2 = False flag3 = True if place_tmp[0] == monster_place: if monster_place == "field": flag3 = True elif str(monster["deck_id"]).find(place_tmp[1]) == -1: flag3 = False else: flag3 = False if (place_tmp[2] == "1" and user == 1 and int(monster["mine_or_other"]) == 1): flag2 = True elif (place_tmp[2] == "1" and user == 2 and int(monster["mine_or_other"]) == 2): flag2 = True elif (place_tmp[2] == "2" and user == 1 and int(monster["mine_or_other"]) == 2): flag2 = True elif(place_tmp[2] == "2" and user == 2 and int(monster["mine_or_other"]) == 1): flag2 = True if monster_place != place_tmp[0]: flag2 = False if flag2 is True and flag3 is True: if current_and_or == "or": flag = True else: if current_and_or == "and": flag = False current_and_or = and_or if flag is False: return False return True def check_trigger_monster_det( self, trigger_monster_condition, monster, user, trigger,move_from ): if monster["det"] is None: monster = move_from monster_place = monster["place"] effect_kind = trigger.trigger_kind tmp2 = json.loads(trigger_monster_condition) tmp2 = tmp2["monster"] flag = True for tmps in tmp2: current_and_or = "and" places = tmps["monster"]["place"] as_monster =tmps["as_monster_condition"] if monster != 0 and not self.check_ignore_monster_place_func( monster["det"], user, effect_kind, monster["place"], monster["deck_id"], monster["x"], monster["y"], user, 1, ): for place_tmp in places: place = place_tmp["det"] and_or = place_tmp["and_or"] place_tmp = place.split("_") flag2 = False flag3 = True if place_tmp[0] == monster_place: if monster_place == "field": flag3 = True if str(monster["deck_id"]).find(place_tmp[1]) == -1: flag3 = False else: flag3 = False if (place_tmp[2] == "1" and user == 1 and monster["mine_or_other"] == 1): flag2 = True elif (place_tmp[2] == "1" and user == 2 and monster["mine_or_other"] == 2): flag2 = True elif (place_tmp[2] == "2" and user == 1 and monster["mine_or_other"] == 2): flag2 = True elif(place_tmp[2] == "2" and user == 2 and monster["mine_or_other"] == 1): flag2 = True if monster_place != place_tmp[0]: flag2 = False ''' elif ( (place_tmp[2] == "2" and user == 1 and monster["mine_or_other"] == 1) or (place_tmp[2] == "2" and user == 2 and monster["mine_or_other"] == 2) or (place_tmp[2] == "1" and user == 2 and monster["mine_or_other"] == 1) or (place_tmp[2] == "1" and user == 1 and monster["mine_or_other"] == 2) ): flag2 = True ''' if flag2 is True and flag3 is True: if current_and_or == "or": flag = True else: if current_and_or == "and": flag = False current_and_or = and_or if flag is False: return False if self.check_ignore_monster_place_condition_func( monster["det"], user, effect_kind, monster["place"], monster["deck_id"], monster["x"], monster["y"], user, 1, ) is False: if as_monster != "trigger_from": if self.check_monster_condition_det( tmps, monster["det"], user, "", 0, monster["place"], monster["deck_id"], monster["x"], monster["y"], monster["mine_or_other"], ): return True else: pprint("BBB") return False else: if self.check_monster_condition_det( tmps, move_from["det"], user, "", 0, move_from["place"], move_from["deck_id"], move_from["x"], move_from["y"], move_from["mine_or_other"], ): return True else: pprint("AAA") return False pprint("CCC") return flag def check_trigger_condition(self, trigger, user, monster=0): duel = self.duel effect_kind = trigger.trigger_kind if trigger.trigger_condition == "": return True trigger_condition = json.loads(trigger.trigger_condition) if "monster" in trigger_condition and monster and monster["det"] is not None: if "choose" in trigger_condition: choose = trigger_condition["choose"] if choose is None: choose = 0 else: choose = 0 if not self.check_ignore_monster_condition_func( monster["det"], user, effect_kind, monster["place"], monster["deck_id"], monster["x"], monster["y"], user, 1, ): excludes = False if "exclude" in trigger_condition: exclude = trigger_condition["exclude"] if exclude: excludes = exclude.split(",") if ( self.check_monster_condition( trigger_condition["monster"], user, False, monster, excludes, choose, effect_kind, ) is False ): return False if "variable" in trigger_condition: if monster and monster["det"] is not None: ignore_variable_name = self.check_ignore_monster_variable_func( monster["det"], user, effect_kind, monster["place"], monster["deck_id"], monster["x"], monster["y"], user, 1, ) else: ignore_variable_name = [] if ( self.check_monster_condition( trigger_condition["monster"], user, False, monster ) is False ): return False variable_flag = True current_and_or = "and" for key in range(len(trigger_condition["variable"])): variable_condition = trigger_condition variable = trigger_condition["variable"][key]["variable"] variable = variable.split("_") mine_or_other = int(variable[2]) variable_name = variable[1] variable = json.loads(duel.global_variable) virtual_variables = self.virtual_variables variable.update(virtual_variables) if variable_name == "chain": if variable_condition["variable"][key]["variable_equation"] == "=": if not duel.virtual_chain == self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not duel.virtual_chain <= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not duel.virtual_chain >= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not duel.virtual_chain != self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif variable_name == "turncount": if variable_condition["variable"][key]["variable_equation"] == "=": if not duel.turn_count == self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not duel.turn_count <= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not duel.turn_count >= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not duel.turn_count != self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif mine_or_other == 0: if variable_condition["variable"][key]["variable_equation"] == "=": if not variable[variable_name][ "value" ] == self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not variable[variable_name][ "value" ] <= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not variable[variable_name][ "value" ] >= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not variable[variable_name][ "value" ] != self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( mine_or_other == 1 and user == 1 or mine_or_other == 2 and user == 2 ): if variable_condition["variable"][key]["variable_equation"] == "=": if not variable[variable_name][ "1_value" ] == self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not variable[variable_name][ "1_value" ] <= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not variable[variable_name][ "1_value" ] >= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not variable[variable_name][ "1_value" ] != self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( mine_or_other == 2 and user == 1 or mine_or_other == 1 and user == 2 ): if variable_condition["variable"][key]["variable_equation"] == "=": if not variable[variable_name][ "2_value" ] == self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not variable[variable_name][ "2_value" ] <= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not variable[variable_name][ "2_value" ] >= self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not variable[variable_name][ "2_value" ] != self.calculate_boland( variable_condition["variable"][key]["variable_val"],user =user ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True current_and_or = variable_condition["variable"][key]["and_or"] if variable_flag is False: return False return True # effect_flagはコスト中に実行されていた場合 def end_cost(self, user,org_chain,trigger,effect_flag=False,copy=0): self.end_cost_clear_relation(user) self.end_cost_copy(user) self.end_cost_remove(user) self.end_cost_under(user) self.end_cost_add(user) self.end_cost_variable(user) self.end_cost_flag(user) self.end_cost_global_variable(user) self.end_cost_clear(user) self.end_cost_shuffle(user) self.duel.in_cost_force = False self.cost_result = {} if effect_flag is False: self.duel.in_pac_cost = "[]" self.duel.in_cost = False self.duel.in_copying = False self.duel.in_cost_cancel = True if self.duel.mute == 0: self.duel.log_turn += self.duel.cost_log self.duel.log += self.duel.cost_log self.current_log += self.duel.cost_log self.duel.cost_log = "" # コストを支払い終わったらチェーン処理 if user == 1: self.duel.appoint = 2 elif user == 2: self.duel.appoint = 1 self.duel.log += self.duel.trigger_log self.duel.log_turn += self.duel.trigger_log self.current_log += self.duel.trigger_log trigger_waiting = json.loads(self.duel.trigger_waiting) chain_det_trigger_json = json.loads(self.duel.chain_det_trigger) chain_det_trigger_json[str(org_chain)] = trigger.id self.duel.chain_det_trigger = json.dumps(chain_det_trigger_json) if copy == 0: self.duel.canbechained = trigger.canbechained else: self.duel.canbechained = False def change_appoint(self,appoint): duel = self.duel if duel.in_cost is True: chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] elif duel.chain == 0: user = self.user else: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] if(appoint== "user_turn"): self.duel.appoint = self.duel.user_turn elif(appoint== "chain"): self.duel.appoint = self.duel.user elif(appoint== "not chain"): if user == 1: self.duel.appoint = 2 elif user == 2: self.duel.appoint = 1 elif(appoint== "change"): if self.duel.appoint == 2: self.duel.appoint = 2 elif self.duel.appoint == 1: self.duel.appoint = 1 def end_cost_copy(self, user): field = self.field if self.cost_result == "": return cost = self.cost_result if "copy" in cost: if "field" in cost["copy"]: for tmp2 in cost["copy"]["field"]: field[tmp2["x"]][tmp2["y"]]["det"] = self.copy_monster_det( field[tmp2["x"]][tmp2["y"]]["det"], tmp2["copy_monster"], tmp2["cost_det"], tmp2["effect_kind"], ) self.field = field if "deck" in cost["copy"]: for tmp2 in cost["copy"]["deck"]: deck_id = tmp2["deck_id"] user = tmp2["mine_or_other"] place_unique_id = tmp2["place_unique_id"] if user == 1 and self.user == 1 or user == 2 and self.user == 2: user_decks = self.decks[deck_id]["mydeck"] elif user == 2 and self.user == 1 or user == 1 and self.user == 2: user_decks = self.decks[deck_id]["otherdeck"] elif user == 3: user_decks = self.decks[deck_id]["commondeck"] index = 0 for user_deck in user_decks: if place_unique_id == user_deck["place_unique_id"]: user_decks[index] = self.copy_monster_det( user_deck, tmp2["copy_monster"], tmp2["cost_det"], tmp2["effect_kind"], ) index += 1 if user == 1 and self.user == 1 or user == 2 and self.user == 2: self.decks[deck_id]["mydeck"] = user_decks elif user == 2 and self.user == 1 or user == 1 and self.user == 2: self.decks[deck_id]["otherdeck"] = user_decks elif user == 3: self.decks[deck_id]["commondeck"] = user_decks if "deck" in cost["copy"]: for tmp2 in cost["copy"]["deck"]: deck_id = tmp2["deck_id"] user = tmp2["mine_or_other"] place_unique_id = tmp2["place_unique_id"] if ( user == 1 and self.user == 1 or user == 2 and self.user == 2 ): user_decks = self.decks[deck_id]["mydeck"] elif ( user == 2 and self.user == 1 or user == 1 and self.user == 2 ): user_decks = self.decks[deck_id]["otherdeck"] elif user == 3: user_decks = self.decks[deck_id]["commondeck"] index = 0 for user_deck in user_decks: if place_unique_id == user_deck["place_unique_id"]: user_decks[index] = self.copy_monster_det( user_deck, tmp2["copy_monster"], tmp2["cost_det"], tmp2["effect_kind"], ) index += 1 if ( user == 1 and self.user == 1 or user == 2 and self.user == 2 ): self.decks[deck_id]["mydeck"] = user_decks elif ( user == 2 and self.user == 1 or user == 1 and self.user == 2 ): self.decks[deck_id]["otherdeck"] = user_decks elif user == 3: self.decks[deck_id]["commondeck"] = user_decks if "grave" in cost["copy"]: for tmp2 in cost["copy"]["grave"]: deck_id = tmp2["deck_id"] user = tmp2["mine_or_other"] place_unique_id = tmp2["place_unique_id"] if user == 1 and self.user == 1 or user == 2 and self.user == 2: user_graves = self.graves[deck_id]["mygrave"] elif user == 2 and self.user == 1 or user == 1 and self.user == 2: user_graves = self.graves[deck_id]["othergrave"] elif user == 3: user_graves = self.graves[deck_id]["commongrave"] index = 0 for user_grave in user_graves: if place_unique_id == user_grave["place_unique_id"]: user_graves[index] = self.copy_monster_det( user_grave, tmp2["copy_monster"], tmp2["cost_det"], tmp2["effect_kind"], ) index += 1 if user == 1 and self.user == 1 or user == 2 and self.user == 2: self.graves[deck_id]["mygrave"] = user_graves elif user == 2 and self.user == 1 or user == 1 and self.user == 2: self.graves[deck_id]["othergrave"] = user_graves elif user == 3: self.graves[deck_id]["commongrave"] = user_graves if "hand" in cost["copy"]: for tmp2 in cost["copy"]["hand"]: deck_id = tmp2["deck_id"] user = tmp2["mine_or_other"] place_unique_id = tmp2["place_unique_id"] if user == 1 and self.user == 1 or user == 2 and self.user == 2: user_hands = self.hands[deck_id]["myhand"] elif user == 2 and self.user == 1 or user == 1 and self.user == 2: user_hands = self.hands[deck_id]["otherhand"] elif user == 3: user_hands = self.hands[deck_id]["commonhand"] index = 0 for user_hand in user_hands: if place_unique_id == user_hand["place_unique_id"]: user_hands[index] = self.copy_monster_det( user_hand, tmp2["copy_monster"], tmp2["cost_det"], tmp2["effect_kind"], ) index += 1 if user == 1 and self.user == 1 or user == 2 and self.user == 2: self.hands[deck_id]["myhand"] = user_hands elif user == 2 and self.user == 1 or user == 1 and self.user == 2: self.hands[deck_id]["otherhand"] = user_hands elif user == 3: self.hands[deck_id]["commonhand"] = user_hands def end_cost_global_variable(self, user): if self.cost_result == "": return cost = self.cost_result variable = json.loads(self.duel.global_variable) if "global_change_val" in cost: for tmp in cost["global_change_val"]: mine_or_other = tmp["mine_or_other"] variable_id = tmp["variable_id"] change_val = tmp["change_val"] change_how = tmp["change_how"] if mine_or_other == 0: if change_how == 0: variable[str(variable_id)]["value"] += change_val elif change_how == 1: variable[str(variable_id)]["value"] -= change_val elif change_how == 2: variable[str(variable_id)]["value"] = change_val elif (mine_or_other == 1 and user == 1) or ( mine_or_other == 2 and user == 2 ): if change_how == 0: variable[str(variable_id)]["1_value"] += change_val elif change_how == 1: variable[str(variable_id)]["1_value"] -= change_val elif change_how == 2: variable[str(variable_id)]["1_value"] = change_val elif (mine_or_other == 2 and user == 1) or ( mine_or_other == 1 and user == 2 ): if change_how == 0: variable[str(variable_id)]["2_value"] += change_val elif change_how == 1: variable[str(variable_id)]["2_value"] -= change_val elif change_how == 2: variable[str(variable_id)]["2_value"] = change_val self.duel.global_variable = json.dumps(variable) def end_cost_under(self, cost_user): if self.cost_result == "": return cost = self.cost_result field = self.field if "under" in cost: if "field" in cost["under"]: for tmp in cost["under"]["field"]: x = tmp["x"] y = tmp["y"] move_to = json.loads(tmp["det"]) if "under" not in field[x][y]["det"]: field[x][y]["det"]["under"] = [] field[x][y]["det"] = self.copy_monster_to_under( move_to, 0, x, y, field[x][y]["mine_or_other"], None, field[x][y]["det"], ) self.field = field def end_cost_add(self, cost_user): if self.cost_result == "": return cost = self.cost_result field = self.field if "add" in cost: if "field" in cost["add"]: for tmp in cost["add"]["field"]: x = tmp["x"] y = tmp["y"] effect_kind = tmp["kind"] move_to = json.loads(tmp["det"]) move_to_tmp = copy.deepcopy(move_to) move_to_org = json.loads(tmp["move_from"]) org_move_to = json.loads(tmp["org_det"]) check_cost = self.cost user = tmp["user"] if ( org_move_to["place_unique_id"] == check_cost[str(self.tmp_chain)]["~trigger"][0][ "place_unique_id" ] ): check_mess = self.mess tmp2 = {} tmp2["x"] = x tmp2["y"] = y tmp2["det"] = move_to_tmp tmp2["place_unique_id"] = move_to_tmp["place_unique_id"] tmp2["card_unique_id"] = move_to_tmp["card_unique_id"] tmp2["mine_or_other"] = user tmp2["user"] = user tmp2["place"] = "field" tmp2["deck_id"] = 0 check_cost[str(self.tmp_chain)]["~trigger"] = [] check_cost[str(self.tmp_chain)]["~trigger"].append(tmp2) check_mess[str(self.tmp_chain)]["trigger"] = [] check_mess[str(self.tmp_chain)]["trigger"].append(tmp2) self.cost = check_cost self.mess = check_mess field[x][y]["det"] = move_to self.raise_trigger( move_to, move_to_org, org_move_to, "cost", "field", field[x][y]["mine_or_other"], user, None, effect_kind, x, y, ) self.field = field if "deck" in cost["add"]: for tmp in cost["add"]["deck"]: effect_kind = tmp["kind"] deck_id = tmp["deck_id"] user = tmp["user"] user_det = tmp["user_det"] how = int(tmp["how"]) move_to = json.loads(tmp["det"]) move_to_tmp = move_to.copy() move_to_org = json.loads(tmp["move_from"]) org_move_to = json.loads(tmp["org_det"]) check_cost = self.cost if ( org_move_to["place_unique_id"] == check_cost[str(self.tmp_chain)]["~trigger"][0][ "place_unique_id" ] ): check_mess = self.mess tmp2 = {} tmp2["x"] = 0 tmp2["y"] = 0 tmp2["det"] = move_to_tmp tmp2["place_unique_id"] = move_to_tmp["place_unique_id"] tmp2["card_unique_id"] = move_to_tmp["card_unique_id"] tmp2["mine_or_other"] = user tmp2["user"] = user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id check_cost[str(self.tmp_chain)]["~trigger"] = [] check_cost[str(self.tmp_chain)]["~trigger"].append(tmp2) check_mess[str(self.tmp_chain)]["trigger"] = [] check_mess[str(self.tmp_chain)]["trigger"].append(tmp2) self.cost = check_cost self.mess = check_mess self.raise_trigger( move_to, move_to_org, org_move_to, "cost", "deck", user, user_det, deck_id, effect_kind, None, None, ) if user == 1 and 1 == self.user or user == 2 and 1 != self.user: user_decks = self.decks[deck_id]["mydeck"] elif user == 2 and 1 == self.user or user == 1 and 1 != self.user: user_decks = self.decks[deck_id]["otherdeck"] elif user == 3: user_decks = self.decks[deck_id]["commondeck"] if how == 0: user_decks.insert(0, move_to) elif how == 1: user_decks.append(move_to) else: range_i = random.randrange(len(user_decks)) user_decks.insert(range_i, move_to) if user == 1 and 1 == self.user or user == 2 and 1 != self.user: self.decks[deck_id]["mydeck"] = user_decks elif user == 2 and 1 == self.user or user == 1 and 1 != self.user: self.decks[deck_id]["otherdeck"] = user_decks elif user == 3: self.decks[deck_id]["commondeck"] = user_decks if "grave" in cost["add"]: for tmp in cost["add"]["grave"]: effect_kind = tmp["kind"] deck_id = tmp["deck_id"] user = tmp["user"] user_det = tmp["user_det"] how = int(tmp["how"]) move_to = json.loads(tmp["det"]) move_to_org = json.loads(tmp["move_from"]) move_to_tmp = move_to.copy() org_move_to = json.loads(tmp["org_det"]) check_cost = self.cost if ( "~trigger" in check_cost[str(self.tmp_chain)] and org_move_to["place_unique_id"] == check_cost[str(self.tmp_chain)]["~trigger"][0][ "place_unique_id" ] ): check_mess = self.mess tmp2 = {} tmp2["x"] = 0 tmp2["y"] = 0 tmp2["det"] = move_to_tmp tmp2["place_unique_id"] = move_to_tmp["place_unique_id"] tmp2["card_unique_id"] = move_to_tmp["card_unique_id"] tmp2["mine_or_other"] = user tmp2["user"] = user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id check_cost[str(self.tmp_chain)]["~trigger"] = [] check_cost[str(self.tmp_chain)]["~trigger"].append(tmp2) check_mess[str(self.tmp_chain)]["trigger"] = [] check_mess[str(self.tmp_chain)]["trigger"].append(tmp2) self.cost = check_cost self.mess = check_mess self.raise_trigger( move_to, move_to_org, org_move_to, "cost", "grave", user, user_det, deck_id, effect_kind, None, None, ) if user == 1 and 1 == self.user or user == 2 and 1 != self.user: user_graves = self.graves[deck_id]["mygrave"] elif user == 2 and 1 == self.user or user == 1 and 1 != self.user: user_graves = self.graves[deck_id]["othergrave"] elif user == 3: user_graves = self.graves[deck_id]["commongrave"] if how == 0: user_graves.insert(0, move_to) elif how == 1: user_graves.append(move_to) else: range_i = random.randrange(len(user_graves)) user_graves.insert(range_i, move_to) if user == 1 and 1 == self.user or user == 2 and 1 != self.user: self.graves[deck_id]["mygrave"] = user_graves elif user == 2 and 1 == self.user or user == 1 and 1 != self.user: self.graves[deck_id]["othergrave"] = user_graves elif user == 3: self.graves[deck_id]["commongrave"] = user_graves if "hand" in cost["add"]: for tmp in cost["add"]["hand"]: effect_kind = tmp["kind"] deck_id = tmp["deck_id"] user = tmp["user"] user_det = tmp["user_det"] move_to = json.loads(tmp["det"]) move_to_org = json.loads(tmp["move_from"]) org_move_to = json.loads(tmp["org_det"]) how = int(tmp["how"]) move_to = json.loads(tmp["det"]) move_to_tmp = move_to.copy() check_cost = self.cost if ( org_move_to["place_unique_id"] == check_cost[str(self.tmp_chain)]["~trigger"][0][ "place_unique_id" ] ): check_mess = self.mess tmp2 = {} tmp2["x"] = 0 tmp2["y"] = 0 tmp2["det"] = move_to_tmp tmp2["det"]["place_unique_id"] = move_to_tmp["place_unique_id"] tmp2["place_unique_id"] = move_to_tmp["place_unique_id"] tmp2["card_unique_id"] = move_to_tmp["card_unique_id"] tmp2["mine_or_other"] = user tmp2["user"] = user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id check_cost[str(self.tmp_chain)]["~trigger"] = [] check_cost[str(self.tmp_chain)]["~trigger"].append(tmp2) check_mess[str(self.tmp_chain)]["trigger"] = [] check_mess[str(self.tmp_chain)]["trigger"].append(tmp2) self.cost = check_cost self.raise_trigger( move_to, move_to_org, org_move_to, "cost", "hand", user, user_det, deck_id, effect_kind, None, None, ) if user == 1 and 1 == self.user or user == 2 and 1 != self.user: user_hands = self.hands[deck_id]["myhand"] elif user == 2 and 1 == self.user or user == 1 and 1 != self.user: user_hands = self.hands[deck_id]["otherhand"] elif user == 3: user_hands = self.hands[deck_id]["commonhand"] if how == 0: user_hands.insert(0, move_to) elif how == 1: user_hands.append(move_to) else: range_i = random.randrange(len(user_hands)) user_hands.insert(range_i, move_to) if user == 1 and 1 == self.user or user == 2 and 1 != self.user: self.hands[deck_id]["myhand"] = user_hands elif user == 2 and 1 == self.user or user == 1 and 1 != self.user: self.hands[deck_id]["otherhand"] = user_hands elif user == 3: self.hands[deck_id]["commonhand"] = user_hands def get_val_designated( self, val, other_user_flag=False, change_val_flag=False, effect_kind="", accumulate_flag=False, global_name=None, ): duel = self.duel val = val[1:-1] val = val.split(":") x = int(val[0]) y = int(val[1]) val_name = val[2] field = self.field user = field[x][y]["user"] field = field[x][y]["det"] tmp4raise = {} tmp4raise["det"] = field[x][y]["det"] tmp4raise["mine_or_other"] = field[x][y]["mine_or_other"] tmp4raise["user"] = user tmp4raise["place"] = "field" tmp4raise["deck_id"] = 0 tmp4raise["x"] = x tmp4raise["y"] = y tmp4raise["place_unique_id"] = field[x][y]["det"]["place_unique_id"] return_value = 0 if len(val) > 3: eternal_kind = val[3] if eternal_kind != "": if self.check_eternal_invalid( field[x][y]["det"], field[x][y]["mine_or_other"], eternal_kind, "field", 0, x, y, field[x][y]["mine_or_other"], ): return 0 val_name = self.check_swap_val( field["det"], user, "field", 0, x, y, val_name, 1 ) val_name2 = self.check_swap_init_val( field["det"], user, "field", 0, x, y, val_name, 1 ) if val_name == "name": return field["det"]["monster_name"] else: if val_name2 in field["det"]["variables"]: return_value = int(field["det"]["variables"][val_name2]["value"]) return_value = self.check_change_val( field["det"], field["mine_or_other"], "field", 0, x, y, val_name, 1,return_value ) if isinstance(return_value, str): return return_value if return_value < 0 and ( val_name not in field[x][y]["det"]["variables"] or field["det"]["variabels"][val_name]["minus"] is False ): return_value = 0 if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( tmp4raise, return_value, 0, effect_kind, user, 1 ) if accumulate_flag is True: self.accumulate_global( tmp4raise, return_value, 0, effect_kind, user, global_name ) return_value = 0 if duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], field[x][y]["mine_or_other"], global_name["variable_how"], effect_kind, return_value, ) return_value -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_value, 1, user, effect_kind, ) return_value -= instead_val self.raise_trigger_change_val( tmp4raise, return_value, 0, effect_kind, user, 0 ) return return_value def floor(self, src, num): range = pow(10, num) return (int)(src / range) * range def get_val_floor(self, val, pre, other_user_flag=False, effect_kind=""): val = val[1:-1] val = self.floor(pre, int(val)) return val def get_val_sum( self, val, other_user_flag=False, change_val_flag=False, effect_kind="", accumulate_flag=False, global_name=None, eternal = False, user = None ): duel = self.duel val = val[1:-1] val = val.split(":") place = val[0] deck_id = int(val[1]) mine_or_other = int(val[2]) if len(val) > 3: val_name = val[3] else: val_name = "" if len(val) > 4 and val[4] != "": cond = val[4] cond = cond.split("^") else: cond = [] if len(val) > 5: method = val[5] else: method = "SUM" if len(val) > 6 and val[6] != "": flag = val[6] else: flag = False if len(val) > 7: eternal_kind = val[7] else: eternal_kind = "" if len(val) > 8 and val[8] != "": monster_id = int(val[8]) else: monster_id = -1 if len(val) > 9 and val[9] != "": init = int(val[9]) else: init = 0 if user is not None: pass elif duel.in_cost is True : chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] elif duel.chain == 0: user = self.duel.appoint elif duel.ask == 1: user = self.user elif duel.ask == 2: user = self.user elif duel.ask == 3: user = self.user else: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] if other_user_flag is True : if mine_or_other == 1: mine_or_other = 2 elif mine_or_other == 2: mine_or_other = 1 return_value = 0 if (mine_or_other == 1 and user == 1) or (mine_or_other == 2 and user != 1): mine_or_other_absolute = 1 elif (mine_or_other == 2 and user == 1) or (mine_or_other == 1 and user != 1): mine_or_other_absolute = 2 else: mine_or_other_absolute = 3 if place == "deck": if ( (mine_or_other_absolute == 1 and 1 == self.user) or (mine_or_other_absolute == 2 and 1 != self.user) ): cards = self.decks[deck_id]["mydeck"] elif ( (mine_or_other_absolute == 2 and 1 == self.user) or (mine_or_other_absolute == 1 and 1 != self.user) ): cards = self.decks[deck_id]["otherdeck"] elif mine_or_other == 3: cards = self.decks[deck_id]["commondeck"] if place == "grave": if ( (mine_or_other_absolute == 1 and 1 == self.user) or (mine_or_other_absolute == 2 and 1 != self.user) ): cards = self.graves[deck_id]["mygrave"] elif ( (mine_or_other_absolute == 2 and 1 == self.user) or (mine_or_other_absolute == 1 and 1 != self.user) ): cards = self.graves[deck_id]["othergrave"] elif mine_or_other == 3: cards = self.graves[deck_id]["commongrave"] if place == "hand": if ( (mine_or_other_absolute == 1 and 1 == self.user) or (mine_or_other_absolute == 2 and 1 != self.user) ): cards = self.hands[deck_id]["myhand"] elif ( (mine_or_other_absolute == 2 and 1 == self.user) or (mine_or_other_absolute == 1 and 1 != self.user) ): cards = self.hands[deck_id]["otherhand"] elif mine_or_other == 3: cards = self.hands[deck_id]["commonhand"] for card in cards: if monster_id != -1: if monster_id != int(self.get_monster_id_easy(card)): continue if eternal_kind != "": if self.check_eternal_invalid( card, mine_or_other, eternal_kind, place, deck_id, 0, 0, mine_or_other, ): continue if val_name == "name": return card["monster_name"] if flag: if flag[0] == "^": if int(flag[1:]) & int(card["flag"]): continue else: if not (int(flag) & int(card["flag"])): continue tmp2 = card["variables"] tmp4raise = {} tmp4raise["det"] = card tmp4raise["mine_or_other"] = mine_or_other_absolute tmp4raise["user"] = user tmp4raise["place"] = place tmp4raise["deck_id"] = deck_id tmp4raise["x"] = 0 tmp4raise["y"] = 0 tmp4raise["place_unique_id"] = card["place_unique_id"] cond_flag = True next_and_or = "and" for cond_det in cond: cond_det = cond_det.split("@") current_and_or = next_and_or if len(cond_det) > 3: next_and_or = cond_det[3] else: next_and_or = "and" tmp3 = int(tmp2[cond_det[0]]["value"]) tmp3 = self.check_change_val( card, mine_or_other_absolute, place, deck_id, 0, 0, cond_det[0], mine_or_other_absolute, tmp3 ) tmp3 = int(tmp3) if cond_det[2] == "=": if int(cond_det[1]) == tmp3: if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False elif cond_det[2] == ">=": if tmp3 >= int(cond_det[1]): if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False elif cond_det[2] == "<=": if tmp3 <= int(cond_det[1]): if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False elif cond_det[2] == "!=": if tmp3 != int(cond_det[1]): if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False if cond_flag is False: continue if val_name == "" or val_name == "0": return_value += 1 else: val_name = self.check_swap_val( card, user, place, deck_id, 0, 0, val_name, 1 ) val_name2 = self.check_swap_init_val( card, user, place, deck_id, 0, 0, val_name, 1 ) if init == 1: return_tmp = int(tmp2[val_name2]["i_val"]) else: if val_name in tmp2: return_tmp = int(tmp2[val_name2]["value"]) return_tmp = self.check_change_val( card, user, place, deck_id, 0, 0, val_name, 1,return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name]["minus"] is False ): return_tmp = 0 if method == "SUM": if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( tmp4raise, return_tmp, 0, "", user, 1 ) if accumulate_flag is True: self.accumulate_global( tmp4raise, return_tmp, 0, "", user, global_name ) return_tmp = 0 elif duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], mine_or_other, global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, user, effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( tmp4raise, return_tmp, 0, effect_kind, user, 0 ) return_value += return_tmp elif method == "MAX": return_value = max(int(return_tmp), return_value) elif method == "MIN": return_value = min(int(return_tmp), return_value) return return_value def get_val_sum_field( self, val, other_user_flag=False, change_val_flag=False, effect_kind="", accumulate_flag=False, global_name=None, eternal = False ): duel = self.duel val = val[1:-1] val = val.split(":") place = int(val[0]) mine_or_other = int(val[1]) if duel.in_cost is True: chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] elif duel.chain == 0: user = duel.appoint elif duel.ask == 1: user = self.user elif duel.ask == 2: user = self.user elif duel.ask == 3: user = self.user else: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] if other_user_flag is True and eternal is True: if mine_or_other == 1: mine_or_other = 2 elif mine_or_other == 2: mine_or_other = 1 if mine_or_other != 3: if (user == 1 and mine_or_other == 1) or (user == 2 and mine_or_other == 2): mine_or_other = 1 else: mine_or_other = 2 val_name = val[2] val_name_array = val_name.split("#") if len(val) >14: init = int(val[14]) else: init = 0 if len(val) > 3 and val[3] != "": flag = int(val[3]) if flag == 0: flag = False else: flag = False if len(val) > 4: eternal_flag = val[4] else: eternal_flag = False if len(val) > 5: method = val[5] else: method = "SUM" if len(val) > 6: cond = val[6] if cond != "": cond = cond.split("^") else: cond = [] else: cond = [] field = self.field if len(val) > 7 and val[7] != "": x = int(val[7]) y = int(val[8]) if len(val_name_array) == 1: if init == 1: return field[x][y]["det"]["variables"][val_name]["i_val"] val_name2 = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name, 1, ) val_name3 = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name2, 1, ) tmp2 = field[x][y]["det"]["variables"][val_name3]["value"] if isinstance(tmp2, str) and self.is_float(tmp2) is False: return tmp2 else: tmp2 = int(tmp2) tmp2 = self.check_change_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name2, field[x][y]["mine_or_other"], tmp2, ) if isinstance(tmp2, str): return tmp2 if tmp2 < 0 and field[x][y]["det"]["variables"][val_name2]["minus"] is False: tmp2 = 0 return int(tmp2) else: val_name2 = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[0], 1, ) val_name3 = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[0], 1, ) if init == 1: tmp2 = field[x][y]["det"]["variables"][val_name3]["i_val"] else: tmp2 = field[x][y]["det"]["variables"][val_name3]["value"] if isinstance(tmp2, str) and self.is_float(tmp2) is False: return tmp2 else: tmp2 = int(tmp2) tmp2 = self.check_change_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[0], field[x][y]["mine_or_other"], tmp2, ) if init == 1: val_name4 = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[2], 1, ) val_name5 = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[2], 1, ) tmp3 = field[x][y]["det"]["variables"][val_name5]["i_val"] else: val_name4 = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[2], 1, ) val_name5 = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[2], 1, ) tmp3 = field[x][y]["det"]["variables"][val_name5]["value"] if isinstance(tmp3, str) and self.is_float(tmp3) is False: return tmp3 else: tmp3 = int(tmp3) tmp3 = self.check_change_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name4, field[x][y]["mine_or_other"], tmp3, ) if val_name_array[1] == "+": return tmp2+tmp3 else: return tmp2-tmp3 field_size = FieldSize.objects.get(id=1) rel_name = None if len(val) > 9: rel_name = val[9] rel_kind = val[10] if val[11] != "": rel_to = int(val[11]) else: rel_to = 0 if val[12] != "": rel_id = int(val[12]) else: rel_id = 0 if len(val) > 13 and val[13] != "": monster_id = int(val[13]) else: monster_id = -1 tmp3 = 0 if self.field_free is True: field_x = 20 else: field_x = field_size.field_x for x in range(field_x): for y in range(field_size.field_y): if self.field_free is False: kind = field[x][y]["kind"] else: kind = field[0][y]["kind"] kind = kind.split("_") if field[x][y]["mine_or_other"] == mine_or_other and str(place) in kind: if field[x][y]["det"] is not None: if monster_id != -1: if monster_id != int( self.get_monster_id_easy(field[x][y]["det"]) ): continue if flag: if field[x][y]["det"]["flag"] & flag == 0: continue if eternal_flag is True: if self.check_eternal_invalid( field[x][y]["det"], field[x][y]["det"]["mine_or_other"], eternal_flag, "field", 0, x, y, field[x][y]["mine_or_other"], ): continue cond_flag = True next_and_or = "and" for cond_det in cond: cond_det = cond_det.split("@") current_and_or = next_and_or if len(cond_det) > 3: next_and_or = cond_det[3] else: next_and_or = "and" val_name4 = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, cond_det[0], 1, ) val_name5 = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, cond_det[0], 1,) if val_name5 in field[x][y]["det"]["variables"]: tmp4 = field[x][y]["det"]["variables"][val_name5]["value"].split("_") else: tmp4 = [0] if len(tmp4) <= 1: tmp4 = int(tmp4[0]) tmp4 = self.check_change_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name4, field[x][y]["mine_or_other"], tmp4 ) if cond_det[2] == "=": if isinstance(tmp4,list): if cond_det[1] in tmp4: if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False else: if int(cond_det[1]) == int(tmp4): if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False elif cond_det[2] == ">=": if int(tmp4) >= int(cond_det[1]): if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False elif cond_det[2] == "<=": if int(tmp4) <= int(cond_det[1]): if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False elif cond_det[2] == "!=": if int(tmp4) != int(cond_det[1]): if current_and_or == "or": cond_flag = True else: if current_and_or == "and": cond_flag = False if cond_flag is False: continue if rel_name is not None and rel_name != "": rel_flag = False if ( "rel" in field[x][y]["det"] and rel_kind in field[x][y]["det"]["rel"] ): for rel_monster in field[x][y]["det"]["rel"][rel_kind]: if ( rel_monster["name"] != rel_name or rel_monster["to"] != rel_to ): continue rel_monster_det = rel_monster["monster"] monster = self.get_monster( rel_monster_det["place"], rel_monster_det["place_unique_id"], rel_monster_det["mine_or_other"], rel_monster_det["user"], rel_monster_det["deck_id"], rel_monster_det["x"], rel_monster_det["y"], ) if rel_id != "": if ( self.get_monster_id_easy(monster["det"]) != rel_id ): continue rel_flag = True break if rel_flag is False: continue if val_name == "": tmp3 += 1 elif val_name == "name": return field[x][y]["det"]["monster_name"] else: tmp2 = field[x][y]["det"]["variables"] tmp4raise = {} tmp4raise["det"] = field[x][y]["det"] tmp4raise["mine_or_other"] = field[x][y]["mine_or_other"] tmp4raise["user"] = user tmp4raise["place"] = "field" tmp4raise["deck_id"] = 0 tmp4raise["x"] = x tmp4raise["y"] = y tmp4raise["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] return_tmp = 0 return_tmp2 = 0 if len(val_name_array) == 1: val_name = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name, 1, ) val_name2 = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name, 1, ) if init == 1: return_tmp = int(tmp2[val_name2]["i_val"]) else: if val_name in tmp2: return_tmp = int(tmp2[val_name2]["value"]) return_tmp = self.check_change_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name, field[x][y]["mine_or_other"], return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name]["minus"] is False ): return_tmp = 0 else: val_name_array[0] = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[0], 1, ) val_name_tmp = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[0], 1, ) if init == 1: return_tmp = int(tmp2[val_name_tmp]["i_val"]) else: if val_name_array[0] in tmp2: return_tmp = int(tmp2[val_name_tmp]["value"]) return_tmp = self.check_change_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[0], field[x][y]["mine_or_other"], return_tmp ) val_name_array[2] = self.check_swap_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[2], 1, ) val_name_tmp2 = self.check_swap_init_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[2], 1, ) if init == 1: return_tmp = int(tmp2[val_name_tmp2]["i_val"]) else: if val_name_array[2] in tmp2: return_tmp2 = int(tmp2[val_name_tmp2]["value"]) return_tmp2 = self.check_change_val( field[x][y]["det"], field[x][y]["mine_or_other"], "field", 0, x, y, val_name_array[2], field[x][y]["mine_or_other"], return_tmp2 ) if val_name_array[1] == "+": return_tmp = return_tmp + return_tmp2 else: return_tmp = return_tmp - return_tmp2 if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name]["minus"] is False ): return_tmp = 0 if method == "SUM": if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( tmp4raise, return_tmp, 0, effect_kind, user, 1 ) if accumulate_flag is True: self.accumulate_global( tmp4raise, return_tmp, 0, effect_kind, user, global_name, ) return_tmp = 0 elif duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], mine_or_other, global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, user, effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( tmp4raise, return_tmp, 0, effect_kind, user, 0 ) tmp3 += return_tmp elif method == "MAX": tmp3 = max(return_tmp, tmp3) elif method == "MIN": tmp3 = min(return_tmp, tmp3) return tmp3 def get_val_variable_mess(self, val, other_user_flag=False, effect_kind=""): tmp = self.variable_mess change_val = tmp[str(self.duel.chain - 1)] return change_val def get_val( self, val, other_user_flag=False, effect_kind_rel="", change_val_flag=False, effect_kind="", accumulate_flag=False, global_name=None, mode=0, ): val = val[1:-1] val = val.split(":") name = val[0] val_name = val[1] if len(val) > 2 and val[2] != "": flag = int(val[2]) else: flag = "" rel_name = None if len(val) > 3: rel_name = val[3] rel_kind = val[4] if val[5] != "": rel_to = int(val[5]) else: rel_to = 0 if val[6] != "": rel_id = int(val[6]) else: rel_id = 0 if len(val) > 7: under = int(val[7]) else: under = 0 if (len(val) > 8) and val[8] != "": id = int(val[8]) else: id = -1 if (len(val) > 9) and val[9] != "": monster_effect_kind = val[9] else: monster_effect_kind = "0" if (len(val) > 10) and val[10] == "1": init = val[10] else: init = 0 return_value = 0 if mode == 0: tmp = self.mess if self.duel.chain == 0 or self.duel.chain == 1: tmp_chain = 1 else: tmp_chain = self.duel.chain -1 if name not in tmp[str(tmp_chain - 1)]: tmp = [] else: tmp = tmp[str(tmp_chain - 1)][name] else: if name not in self.timing_mess: tmp = [] else: tmp = self.timing_mess[name] for monster in tmp: if id != -1: if int(id) != int(self.get_monster_id_easy(monster["det"])): continue if rel_name is not None and rel_name != "": if "rel" in monster["det"] and rel_kind in monster["det"]["rel"]: for rel_monster in monster["det"]["rel"][rel_kind]: if ( rel_monster["name"] != rel_name or rel_monster["to"] != rel_to ): continue rel_monster_det = rel_monster["monster"] monster2 = self.get_monster( rel_monster_det["place"], rel_monster_det["place_unique_id"], rel_monster_det["mine_or_other"], rel_monster_det["user"], rel_monster_det["deck_id"], rel_monster_det["x"], rel_monster_det["y"], ) if rel_id != "" and rel_id != 0: if self.get_monster_id_easy(monster2["det"]) != rel_id: continue if monster_effect_kind != "0": if self.check_eternal_invalid( monster2["det"], monster2["user"], monster_effect_kind, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], ): continue if effect_kind_rel != "": if self.check_not_effected( monster2["det"], monster2["user"], effect_kind_rel, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], 0, ): return "NoneEffect" return_tmp = 0 if val_name == "place_id": return monster2["place_unique_id"] if val_name == "name": return monster2["det"]["monster_name"] elif val_name == "": return_tmp += 1 else: val_name = self.check_swap_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, ) val_name2 = self.check_swap_init_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, ) if val_name2 in monster2["det"]["variables"]: return_tmp += int( monster2["det"]["variables"][val_name2]["value"] ) if init == 0: return_tmp = self.check_change_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name in monster2["det"]["variables"] or monster2["det"]["variables"][val_name]["minus"] is False ): return_tmp = 0 if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], 1, ) if accumulate_flag is True: self.accumulate_global( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], global_name, ) return_tmp = 0 elif self.duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], monster2["mine_or_other"], global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, monster2["mine_or_other"], effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], 0, ) return_value += return_tmp elif under == 1: if "under" not in monster["det"]: return 0 for under_monster in monster["det"]["under"]: if monster_effect_kind != "0": if self.check_eternal_invalid( under_monster["det"], under_monster["user"], monster_effect_kind, under_monster["place"], under_monster["deck_id"], under_monster["x"], under_monster["y"], under_monster["mine_or_other"], ): continue if val_name == "name": return under_monster["monster_name"] elif val_name == "place_id": return under_monster["place_unique_id"] if val_name != "": tmp2 = under_monster["variables"] return_tmp2 = 0 val_name = self.check_swap_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) val_name2 = self.check_swap_init_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) if val_name in tmp2: return_tmp = tmp2[val_name2]["value"] if ( isinstance(return_tmp, str) and self.is_float(return_tmp) is False ): return return_tmp else: return_tmp = int(return_tmp) if init == 0: return_tmp = self.check_change_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name]["minus"] is False ): return_tmp = 0 if self.is_float(return_tmp): return_tmp2 += int(return_tmp) else: return return_tmp if not isinstance(return_tmp, str) or self.is_float(return_tmp): return_tmp2 += int(return_tmp) else: return return_tmp return_value += return_tmp2 else: return_value += 1 else: if monster_effect_kind != "0": if self.check_eternal_invalid( monster["det"], monster["user"], monster_effect_kind, monster["place"], monster["deck_id"], monster["x"], monster["y"], monster["mine_or_other"], ): continue if flag is True: if "flag" in monster and monster["flag"] & flag == 0: continue if(monster["det"] is None): tmp2 = [] else: tmp2 = monster["det"]["variables"] return_tmp = 0 if val_name == "": return_tmp = 1 elif val_name == "name": return monster["det"]["monster_name"] elif val_name == "x": return monster["x"] elif val_name == "y": return monster["y"] else: val_name = self.check_swap_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["user"], ) val_name2 = self.check_swap_init_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["user"], ) if val_name2 in tmp2: if tmp2[val_name2]["value"].isnumeric(): return_tmp = int(tmp2[val_name2]["value"]) else: return_tmp = 0 if init == 0: return_tmp = self.check_change_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name]["minus"] is False ): return_tmp = 0 if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], 1 ) if accumulate_flag is True: self.accumulate_global( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], global_name, ) return_tmp = 0 elif self.duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], monster["mine_or_other"], global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, monster["mine_or_other"], effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], 0 ) return_value += return_tmp return return_value def get_val_trigger( self, val, monster, other_user_flag=False, effect_kind_rel="", change_val_flag=False, effect_kind="", accumulate_flag=False, global_name=None, ): val = val[1:-1] val = val.split(":") if len(val) > 1: val_name = val[1] else: val_name = "" rel_name = None if len(val) > 3: rel_name = val[3] rel_kind = val[4] rel_id = 0 if len(val) > 5: if val[5] != "": rel_to = int(val[5]) else: rel_to = 0 if len(val) > 6: if val[6] != "": rel_id = int(val[6]) else: rel_id = 0 if len(val) > 7: under = int(val[7]) else: under = False if (len(val) > 8) and val[8] != "": id = int(val[8]) else: id = -1 if (len(val) > 9) and val[9] != "": monster_effect_kind = val[9] else: monster_effect_kind = "0" if (len(val) > 10) and val[10] != "": init = int(val[10]) else: init = 0 return_value = 0 if id != -1: if int(id) != int(self.get_monster_id_easy(monster["det"])): return 0 if rel_name is not None and rel_name != "": if "rel" in monster["det"] and rel_kind in monster["det"]["rel"]: for rel_monster in monster["det"]["rel"][rel_kind]: if rel_monster["name"] != rel_name or int(rel_monster["to"]) != rel_to: continue rel_monster_det = rel_monster["monster"] monster2 = self.get_monster( rel_monster_det["place"], rel_monster_det["place_unique_id"], rel_monster_det["mine_or_other"], rel_monster_det["user"], rel_monster_det["deck_id"], rel_monster_det["x"], rel_monster_det["y"], ) if rel_id != 0: if self.get_monster_id_easy(monster2["det"]) != rel_id: continue if monster_effect_kind != "0": if self.check_eternal_invalid( monster2["det"], monster2["user"], monster_effect_kind, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], ): continue if effect_kind_rel != "": if self.check_not_effected( monster2["det"], monster2["user"], effect_kind_rel, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], 0, ): continue return_tmp = 0 if val_name == "place_id": return monster2["place_unique_id"] if val_name == "name": return monster2["det"]["monster_name"] else: val_name = self.check_swap_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, ) val_name2 = self.check_swap_init_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, ) if val_name == "": return_tmp += 1 else: if init == 1: return_tmp += int( monster2["det"]["variables"][val_name2]["i_val"] ) else: if val_name2 in monster2["det"]["variables"]: return_tmp += int( monster2["det"]["variables"][val_name2]["value"] ) return_tmp = self.check_change_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in monster2["det"]["variables"] or monster2["det"]["variables"][val_name]["minus"] is False ): return_tmp = 0 if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], 1, ) if accumulate_flag is True: self.accumulate_global( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], global_name, ) return_tmp = 0 elif self.duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], monster2["mine_or_other"], global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, monster2["mine_or_other"], effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], 0, ) return_value += return_tmp elif under == 1: if "under" not in monster["det"]: return 0 for under_monster in monster["det"]["under"]: if monster_effect_kind != "0": if self.check_eternal_invalid( under_monster["det"], under_monster["user"], monster_effect_kind, under_monster["place"], under_monster["deck_id"], under_monster["x"], under_monster["y"], under_monster["mine_or_other"], ): continue if val_name == "name": return under_monster["monster_name"] elif val_name == "place_id": return under_monster["place_unique_id"] if val_name != "": tmp2 = under_monster["variables"] return_tmp2 = 0 val_name = self.check_swap_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) val_name2 = self.check_swap_init_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) if init == 1: return_tmp = tmp2[val_name2]["i_val"] else: if val_name in tmp2: return_tmp = tmp2[val_name2]["value"] if ( isinstance(return_tmp, str) and self.is_float(return_tmp) is False ): return return_tmp else: return_tmp = int(return_tmp) return_tmp = self.check_change_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 and tmp2[val_name]["minus"] is False ): return_tmp = 0 if not isinstance(return_tmp, str) or self.is_float(return_tmp): return_tmp2 += int(return_tmp) else: return return_tmp return_value += return_tmp2 else: return_value += 1 else: if monster_effect_kind != "0": if self.check_eternal_invalid( monster["det"], monster["user"], monster_effect_kind, monster["place"], monster["deck_id"], monster["x"], monster["y"], monster["mine_or_other"], ): return 0 if val_name == "name": return monster["det"]["monster_name"] elif val_name == "place_id": return monster["place_unique_id"] elif val_name == "x": return monster["x"] elif val_name == "y": return monster["y"] if val_name != "": tmp2 = monster["det"]["variables"] return_tmp2 = 0 val_name = self.check_swap_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) val_name2 = self.check_swap_init_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) if init == 1: return_tmp = int(tmp2[val_name2]["i_val"]) else: if val_name2 in tmp2: return_tmp = int(tmp2[val_name2]["value"]) if ( isinstance(return_tmp, str) and self.is_float(return_tmp) is False ): return return_tmp else: return_tmp = int(return_tmp) else: return_tmp = 0 return_tmp = self.check_change_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name]["minus"] is False ): return_tmp = 0 if self.is_float(return_tmp): return_tmp2 += int(return_tmp) else: return return_tmp if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], 1 ) if accumulate_flag is True: self.accumulate_global( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], global_name, ) return_tmp = 0 elif self.duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], monster["mine_or_other"], global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, monster["mine_or_other"], effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], 0 ) return_value += return_tmp2 else: return_value += 1 return return_value def get_place_unique_id(self, val, mode=0): if val[0] == "~": return self.get_place_unique_id_cost(val, mode) elif val[0] == "%": return self.get_place_unique_id_timing_mess(val, mode) else: return self.get_place_unique_id_effect(val, mode) def get_name(self, val, mode=0, monster=None,place_unique_id = ""): if val == "tmp_val": return self.tmp_val[place_unique_id] elif val[0] != "{": return val if val[1] == "~": return self.get_name_cost(val, mode) elif val[1] == "^": return self.get_name_global(val) elif val[1] == "%": return self.get_name_timing_mess(val, mode) else: return self.get_name_effect(val, mode, monster) def get_name_global(self, val): duel = self.duel val = val[1:-1] variable = json.loads(duel.global_variable) return variable[val] def get_name_monster_all(self, monsters): return_value = "" for monster in monsters: return_value += monster["det"]["monster_name"] + " " return return_value def get_place_name(self,val,user): val = val[1:-1] val_ary = val.split(";") val_ary[1] = self.calculate_boland(val_ary[1],user = user) if val_ary[0] == "deck": return self.get_deck_name(val_ary[1],val_ary[2],val_ary[3],user) elif val_ary[0] == "grave": return self.get_grave_name(val_ary[1],val_ary[2],val_ary[3],user) elif val_ary[0] == "hand": return self.get_hand_name(val_ary[1],val_ary[2],val_ary[3],user) def get_deck_name(self,num,deck_id,rel_mine_or_other,user): deck_id = int(deck_id) rel_mine_or_other = int(rel_mine_or_other) mine_or_other = rel_mine_or_other if user == 2: if rel_mine_or_other == 1: mine_or_other = 2 elif rel_mine_or_other == 2: mine_or_other = 1 if rel_mine_or_other == 1: if user == self.user: user_decks = self.decks[deck_id]["mydeck"] else: user_decks = self.decks[deck_id]["otherdeck"] elif rel_mine_or_other == 2: if user == self.user: user_decks = self.decks[deck_id]["otherdeck"] else: user_decks = self.decks[deck_id]["otherdeck"] else: user_decks = self.decks[deck_id]["commondeck"] return self.get_name_det(user_decks,"deck",deck_id,mine_or_other,num) def get_grave_name(self,num,deck_id,rel_mine_or_other,user): deck_id = int(deck_id) rel_mine_or_other = int(rel_mine_or_other) mine_or_other = rel_mine_or_other if user == 2: if rel_mine_or_other == 1: mine_or_other = 2 elif rel_mine_or_other == 2: mine_or_other = 1 if rel_mine_or_other == 1: user_graves = self.graves[deck_id]["mygrave"] elif rel_mine_or_other == 2: user_graves = self.graves[deck_id]["othergrave"] else: user_graves = self.graves[deck_id]["commongrave"] return self.get_name_det(user_graves,"grave",deck_id,mine_or_other,num) def get_hand_name(self,num,deck_id,rel_mine_or_other,user): deck_id = int(deck_id) rel_mine_or_other = int(rel_mine_or_other) mine_or_other = rel_mine_or_other if user == 2: if rel_mine_or_other == 1: mine_or_other = 2 elif rel_mine_or_other == 2: mine_or_other = 1 if rel_mine_or_other == 1: user_hands = self.hands[deck_id]["myhand"] elif rel_mine_or_other == 2: user_hands = self.hands[deck_id]["otherhand"] else: user_hands = self.hands[deck_id]["commonhand"] return self.get_name_det(user_hands,"hand",deck_id,mine_or_other,num) def get_name_det(self,cards,place,deck_id,mine_or_other,num): ret = "" i = 0 for card in cards: monster_name = self.check_change_name( card, mine_or_other, place, deck_id, 0, 0, mine_or_other, ) ret += monster_name[0]+"," i += 1 if i >= num: break ret = ret[:-1] return ret def get_name_all(self, val, mode=0): if val[0] != "{": return val if val[1] == "~": return self.get_name_cost_all(val, mode) elif val[1] == "%": return self.get_name_timing_mess_all(val, mode) else: return self.get_name_effect_all(val, mode) def get_place_unique_id_cost(self, val, mode): tmp = self.cost tmp = tmp[str(self.tmp_chain)][val] tmp = tmp[0] return tmp["det"]["place_unique_id"] def get_place_unique_id_timing_mess(self, val, mode): tmp = self.timing_mess tmp = tmp[val] tmp = tmp[0] return tmp["det"]["place_unique_id"] def get_place_unique_id_effect(self, val, mode): duel = self.duel tmp = self.mess tmp = tmp[str(duel.chain - 1)][val] tmp = tmp[0] return tmp["det"]["place_unique_id"] def get_card_unique_id_cost(self, val, mode): tmp = self.cost tmp = tmp[str(self.tmp_chain)][val] tmp = tmp[0] return tmp["det"]["card_unique_id"] def get_card_unique_id_timing_mess(self, val, mode): tmp = self.timing_mess tmp = tmp[val] tmp = tmp[0] return tmp["det"]["card_unique_id"] def get_card_unique_id_effect(self, val, mode): duel = self.duel tmp = self.mess tmp = tmp[str(duel.chain - 1)][val] tmp = tmp[0] return tmp["det"]["card_unique_id"] def get_name_cost(self, val, mode): val = val[2:-1] tmp = self.cost tmp = tmp[str(self.tmp_chain)][val] tmp = tmp[0] if mode == 1 and tmp["det"]["variables"]["show"]["value"] == "1": hide_name = self.config.hide_name return hide_name return tmp["det"]["monster_name"] def get_name_cost_all(self, val, mode): val = val[1:-1] tmp = self.cost tmps = tmp[str(self.tmp_chain)][val] return_value = [] for tmp in tmps: if mode == 1 and tmp["det"]["variables"]["show"]["value"] == "1": hide_name = self.config.hide_name return_value.append(hide_name) else: return_value.append(tmp["det"]["monster_name"]) return return_value def get_name_timing_mess_all(self, val, mode): val = val[2:-1] tmp = self.timing_mess tmps = tmp[val] return_value = [] for tmp in tmps: if mode == 1 and tmp["det"]["variables"]["show"]["value"] == "1": hide_name = self.config.hide_name return_value.appned(hide_name) else: return_value.appned(tmp["det"]["monster_name"]) return return_value def get_name_timing_mess(self, val, mode): val = val[2:-1] tmp = self.timing_mess tmp = tmp[val] tmp = tmp[0] if mode == 1 and tmp["det"]["variables"]["show"]["value"] == "1": hide_name = self.config.hide_name return hide_name return tmp["det"]["monster_name"] def get_name_effect_all(self, val, mode): duel = self.duel val = val[1:-1] tmp = self.mess if val not in tmp[str(duel.chain-1)]: return [] tmps = tmp[str(duel.chain - 1)][val] return_value = [] for tmp in tmps: if mode == 1 and tmp["det"]["variables"]["show"]["value"] == "1": hide_name = self.config.hide_name return_value.appned(hide_name) else: return_value.append(tmp["det"]["monster_name"]) return return_value def get_name_effect(self, val, mode, monster): duel = self.duel val = val[1:-1] val = val.split(":") tmp = self.mess tmp = tmp[str(duel.chain - 1)][val[0]] tmp = tmp[0] user = tmp["user"] place = tmp["place"] deck_id = tmp["deck_id"] x = tmp["x"] y = tmp["y"] mine_or_other = tmp["mine_or_other"] if len(val) >= 2: if "eternal" in tmp: for i in range(len(tmp["eternal"])): if tmp["eternal"][i] is None: continue if not self.check_eternal_invalid( tmp, user, tmp["eternal"][i]["effect_kind"], place, deck_id, x, y, mine_or_other, ): if val[1] in tmp["eternal"][i]["variables"]: return tmp["eternal"][i]["variables"] return tmp["det"]["variables"][val[1]]["value"] if mode == 1 and tmp["det"]["variables"]["show"]["value"] == "1": hide_name = self.config.hide_name return hide_name return tmp["det"]["monster_name"] def get_val_cost( self, val, other_user_flag=False, effect_kind_rel="", change_val_flag=False, effect_kind="", accumulate_flag=False, global_name=None, ): return_value = 0 val = val[1:-1] val = val.split(":") name = val[0] val_name = val[1] if 2 in val and val[2] != "": flag = val[2] else: flag = False tmp = self.cost if self.duel.in_cost is True: if name in tmp[str(self.tmp_chain)]: tmp = tmp[str(self.tmp_chain)][name] else: tmp = {} else: if name in tmp[str(self.duel.chain - 1)]: tmp = tmp[str(self.duel.chain - 1)][name] else: tmp = {} rel_name = None if len(val) > 3: rel_name = val[3] rel_kind = val[4] if val[5] != "": rel_to = int(val[5]) else: rel_to = 0 if val[6] != "": rel_id = int(val[6]) else: rel_id = 0 if len(val) > 7 and val[7] != "": under = int(val[7]) else: under = 0 if (len(val) > 8) and val[8] != "": id = int(val[8]) else: id = -1 if (len(val) > 9) and val[9] != "": monster_effect_kind = val[9] else: monster_effect_kind = "0" return_value = 0 for monster in tmp: if id != -1: if int(id) != int(self.get_monster_id_easy(monster["det"])): return 0 if rel_name is not None and rel_name != "": if "rel" in monster["det"] and rel_kind in monster["det"]["rel"]: for rel_monster in monster["det"]["rel"][rel_kind]: if ( rel_monster["name"] != rel_name or rel_monster["to"] != rel_to ): continue rel_monster_det = rel_monster["monster"] monster2 = self.get_monster( rel_monster_det["place"], rel_monster_det["place_unique_id"], rel_monster_det["mine_or_other"], rel_monster_det["user"], rel_monster_det["deck_id"], rel_monster_det["x"], rel_monster_det["y"], ) if rel_id != "": if self.get_monster_id_easy(monster2["det"]) != rel_id: continue if monster_effect_kind != "0": if self.check_eternal_invalid( monster2["det"], monster2["user"], monster_effect_kind, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], ): continue if effect_kind_rel != "": if self.check_not_effected( monster2["det"], monster2["user"], effect_kind_rel, monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], monster2["mine_or_other"], 1, ): return "NoneEffect" return_tmp = 0 if val_name == "place_id": return monster2["place_unique_id"] if val_name == "name": return monster2["det"]["monster_name"] else: val_name = self.check_swap_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, ) val_name2 = self.check_swap_init_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, ) if val_name2 in monster2["det"]["variables"]: return_tmp = int( monster2["det"]["variables"][val_name2]["value"] ) return_tmp = self.check_change_val( monster2["det"], monster2["mine_or_other"], monster2["place"], monster2["deck_id"], monster2["x"], monster2["y"], val_name, 1, return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name2 not in monster2["det"]["variables"] or monster2["det"]["variables"][val_name2]["minus"] is False ): return_tmp = 0 if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], 1, ) if accumulate_flag is True: self.accumulate_global( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], global_name, ) return_tmp = 0 elif self.duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], monster2["mine_or_other"], global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, monster2["mine_or_other"], effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( monster2, return_tmp, 0, effect_kind, monster2["mine_or_other"], 0, ) return_value += return_tmp elif under == 1: if "under" not in monster["det"]: return 0 for under_monster in monster["det"]["under"]: if monster_effect_kind != "0": if self.check_eternal_invalid( under_monster["det"], under_monster["user"], monster_effect_kind, under_monster["place"], under_monster["deck_id"], under_monster["x"], under_monster["y"], under_monster["mine_or_other"], ): continue if val_name == "name": return under_monster["monster_name"] elif val_name == "place_id": return under_monster["place_unique_id"] if val_name != "": tmp2 = under_monster["variables"] return_tmp2 = 0 val_name = self.check_swap_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) val_name2 = self.check_swap_init_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], ) if val_name2 in tmp2: return_tmp = tmp2[val_name2]["value"] if ( isinstance(return_tmp, str) and self.is_float(return_tmp) is False ): return return_tmp else: return_tmp = int(return_tmp) return_tmp = self.check_change_val( under_monster, monster["mine_or_other"], "under", monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name]["minus"] is False ): return_tmp = 0 if self.is_float(return_tmp): pass else: return return_tmp if not isinstance(return_tmp, str) or self.is_float(return_tmp): return_tmp2 += int(return_tmp) else: return return_tmp return_value += return_tmp2 else: return_value += 1 else: if monster_effect_kind != "0": if self.check_eternal_invalid( monster["det"], monster["user"], monster_effect_kind, monster["place"], monster["deck_id"], monster["x"], monster["y"], monster["mine_or_other"], ): continue if flag is True: if monster["flag"] & flag == 0: continue tmp2 = monster["det"]["variables"] return_tmp = 0 if val_name == "name": return monster["det"]["monster_name"] else: val_name = self.check_swap_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["user"], ) val_name2 = self.check_swap_init_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["user"], ) if val_name2 in tmp2: if tmp2[val_name2]["value"].isnumeric(): return_tmp += int(tmp2[val_name2]["value"]) return_tmp = self.check_change_val( monster["det"], monster["mine_or_other"], monster["place"], monster["deck_id"], monster["x"], monster["y"], val_name, monster["mine_or_other"], return_tmp ) if isinstance(return_tmp, str): return return_tmp if return_tmp < 0 and ( val_name not in tmp2 or tmp2[val_name2]["minus"] is False ): return_tmp = 0 if change_val_flag and accumulate_flag is False: self.raise_trigger_change_val( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], 1 ) if accumulate_flag is True: self.accumulate_global( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], global_name, ) return_tmp = 0 elif self.duel.alt_global != "" and global_name is not None: alt_val = self.change_alt_global2( global_name["variable_id"], monster["mine_or_other"], global_name["variable_how"], effect_kind, return_tmp, ) return_tmp -= alt_val instead_val = self.check_variable_instead( global_name["variable_id"], global_name["mine_or_other"], return_tmp, 1, monster["mine_or_other"], effect_kind, ) return_tmp -= instead_val self.raise_trigger_change_val( monster, return_tmp, 0, effect_kind, monster["mine_or_other"], 0 ) return_value += return_tmp return return_value def get_val_global(self, val, other_user_flag=False, effect_kind="",other_user_flag2=False): duel = self.duel chain = str(duel.chain - 1) if duel.in_cost is True: chain = str(self.tmp_chain) user = duel.cost_user elif self.duel.retrieve == 0 and (duel.chain == 0 or duel.ask > 0): user = self.user elif self.duel.retrieve == 0 and other_user_flag2 is True: if self.user == 1: user = 2 elif self.user == 2: user = 1 elif self.duel.retrieve == 0: user = self.user elif duel.chain == 0: user = self.user else: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] val = val[1:-1] val = val.split(":") variable_name = val[0] if variable_name == "turncount": return duel.turn_count if variable_name == "chain": return duel.virtual_chain mine_or_other = int(val[1]) variable = json.loads(duel.global_variable) chain_variable_det = json.loads(duel.chain_variable) if mine_or_other == 0: if variable_name in variable: return int(variable[variable_name]["value"]) elif variable_name in self.virtual_variables: return int(self.virtual_variables[variable_name]["value"]) elif ( chain in chain_variable_det and variable_name in chain_variable_det[chain] ): return chain_variable_det[chain][variable_name] else: return 0 if other_user_flag is True: if mine_or_other == 1: mine_or_other2 = 2 elif mine_or_other == 2: mine_or_other2 = 1 else: mine_or_other2 = mine_or_other if (mine_or_other2 == 1 and user == 1) or (mine_or_other2 == 2 and user == 2): if variable_name in variable: return int(variable[variable_name]["1_value"]) elif variable_name in self.virtual_variables: return int(self.virtual_variables[variable_name]["1_value"]) elif ( chain in chain_variable_det and variable_name in chain_variable_det[chain] ): return chain_variable_det[chain][variable_name] else: return 0 if (mine_or_other2 == 2 and user == 1) or (mine_or_other2 == 1 and user == 2): if variable_name in variable: return int(variable[variable_name]["2_value"]) elif variable_name in self.virtual_variables: return int(self.virtual_variables[variable_name]["2_value"]) elif ( chain in chain_variable_det and variable_name in chain_variable_det[chain] ): return chain_variable_det[chain][variable_name] else: return 0 def special_val(self,val): if type(val) == str and len(val) > 0: if val[0]== "-" or val[0] == "{" or val[0] == "[" or val[0] == "[" or val[0] == "&" or val[0]=="|" or val[0]=="^": return True return False def calculate_boland( self, boland, monster=None, other_user_flag=False, mode=0, monster2=None, effect_kind_rel="", change_val_flag=False, effect_kind="", accumulate_flag=False, global_name=None, other_user_flag2=False, eternal = False, user = None ): if other_user_flag2 == True: other_user_flag = True if boland == "": return 0 operator = { "SWITCH": (lambda x, y: x if int(y) != 0 else 0 ), "SWITCH2": (lambda x, y: x if int(y) == 0 else 0 ), "MIN": (lambda x, y: min(x, y)), "MAX": (lambda x, y: max(x, y)), "+": (lambda x, y: x + y), "-": (lambda x, y: x - y), "*": (lambda x, y: x * y), "/": (lambda x, y: float(x) / y), } stack = [] boland = str(boland) states = boland.split("$") for index, z in enumerate(states): if z not in operator.keys(): if z[0] == "-": minus_flag = True z = z[1:] else: minus_flag = False if z[0] == "{": if z[1] != "~": if z[1] == "%": z = self.get_val( z, other_user_flag, effect_kind_rel, change_val_flag, effect_kind, accumulate_flag, global_name, 1, ) else: tmp = z[1:-1].split(":") if ( monster is None or monster == 0 or tmp[0] != "this" ): z = self.get_val( z, other_user_flag, effect_kind_rel, change_val_flag, effect_kind, accumulate_flag, global_name, ) else: z = self.get_val_trigger( z, monster, other_user_flag, effect_kind_rel, change_val_flag, effect_kind, accumulate_flag, global_name, ) else: z = self.get_val_cost( z, other_user_flag, effect_kind_rel, change_val_flag, effect_kind, accumulate_flag, global_name, ) elif z[0] == "[": z = self.get_val_designated( z, other_user_flag, change_val_flag, effect_kind, accumulate_flag, global_name, ) elif z[0] == "&": z = self.get_val_sum( z, other_user_flag, change_val_flag, effect_kind, accumulate_flag, global_name, eternal, user ) elif z[0] == "|": z = self.get_val_sum_field( z, other_user_flag, change_val_flag, effect_kind, accumulate_flag, global_name, eternal ) elif z[0] == "=": t = stack.pop() z = self.get_val_floor(z, t, other_user_flag, effect_kind) elif z[0] == "#": z = self.get_val_variable_mess(z, other_user_flag, effect_kind) elif z[0] == "^": z = self.get_val_global(z, other_user_flag, effect_kind,other_user_flag2) else: if z[0] == "r": if user == 1: z = float(z[2:]) else: z = -float(z[2:]) else: z = float(z) if z == "NoneEffect": return 0 if minus_flag == True: z = -z stack.append(z) continue y = stack.pop() x = stack.pop() stack.append(operator[z](float(x), float(y))) if isinstance(stack[0], str): return stack[0] if mode == 0: return max(float(stack[0]), 0) elif mode == 1: return float(stack[0]) def end_cost_flag(self, cost_user): if not self.cost_result: return cost = self.cost_result if "flag" in cost: if "field" in cost["variable"]: field = self.field for tmp in cost["variable"]["field"]: x = tmp["x"] y = tmp["y"] place_unique_id = tmp["place_unique_id"] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue else: if field[x][y]["det"]["place_unique_id"] != place_unique_id: continue if "change_flag" in tmp: flag = tmp["change_flag"] else: flag = 0 field[x][y]["det"]["flag"] = flag self.field = field if "deck" in cost["flag"]: for tmp in cost["variable"]["flag"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): user_decks = self.decks[deck_id]["mydeck"] elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): user_decks = self.decks[deck_id]["otherdeck"] elif user == 3: user_decks = self.decks[deck_id]["commondeck"] for key in range(len(user_decks)): user_deck = user_decks[key] if place_unique_id == user_deck["place_unique_id"]: change_flag = tmp["change_flag"] user_deck["flag"] = change_flag user_decks[key] = user_deck if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): self.decks[deck_id]["mydeck"] = user_decks elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): self.decks[deck_id]["otherdeck"] = user_decks elif user == 3: self.decks[deck_id]["commondeck"] = user_decks if "grave" in cost["flag"]: for tmp in cost["flag"]["grave"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): user_graves = self.graves[deck_id]["mygrave"] elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): user_graves = self.graves[deck_id]["othergrave"] elif user == 3: user_graves = self.graves[deck_id]["commongrave"] for key in range(len(user_graves)): user_grave = user_graves[key] if place_unique_id == user_grave["place_unique_id"]: change_flag = tmp["change_flag"] user_grave["flag"] = change_flag user_graves[key] = user_grave if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): self.graves[deck_id]["mygrave"] = user_graves elif (user == 2 and 1 == self.user) or user == 1 and 2 == self.user: self.graves[deck_id]["othergrave"] = user_graves elif user == 3: self.graves[deck_id]["commongrave"] = user_graves if "hand" in cost["flag"]: for tmp in cost["flag"]["hand"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): user_hands = self.hands[deck_id]["myhand"] elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): user_hands = self.hands[deck_id]["otherhand"] elif user == 3: user_hands = self.hands[deck_id]["commonhand"] for key in range(len(user_hands)): user_hand = user_hands[key] if place_unique_id == user_hand["place_unique_id"]: change_flag = tmp["change_flag"] user_hand["flag"] = change_flag user_hands[key] = user_hand if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): self.hands[deck_id]["myhand"] = user_hands elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): self.hands[deck_id]["otherhand"] = user_hands elif user == 3: self.hands[deck_id]["commonhand"] = user_hands def end_cost_variable(self, cost_user): if not self.cost_result: return cost = self.cost_result if "variable" in cost: if "field" in cost["variable"]: field = self.field for tmp in cost["variable"]["field"]: x = tmp["x"] y = tmp["y"] place_unique_id = tmp["place_unique_id"] tmp2 = {} tmp2["det"] = field[x][y]["det"] tmp2["mine_or_other"] = field[x][y]["mine_or_other"] tmp2["user"] = cost_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue else: if field[x][y]["det"]["place_unique_id"] != place_unique_id: continue change_val_eternal = tmp["change_variable"] if "eternal" not in field[x][y]["det"]: field[x][y]["det"]["eternal"] = [] field[x][y]["det"]["eternal"].append(change_val_eternal) for change_tmp in change_val_eternal["variables"].keys(): self.raise_trigger_monster_change_val(tmp2, change_val_eternal["variables"][change_tmp]["value"], "cost", change_val_eternal["variables"][change_tmp]["effect_kind"], cost_user, 1, change_tmp) self.field = field if "deck" in cost["variable"]: for tmp in cost["variable"]["deck"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): user_decks = self.decks[deck_id]["mydeck"] elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): user_decks = self.decks[deck_id]["otherdeck"] elif user == 3: user_decks = self.decks[deck_id]["commondeck"] for key in range(len(user_decks)): user_deck = user_decks[key] if place_unique_id == user_deck["place_unique_id"]: change_val_eternal = tmp["change_variable"] if "eternal" not in user_deck: user_deck["eternal"] = [] user_deck["eternal"].append(change_val_eternal) tmp2 = {} tmp2["det"] = user_deck tmp2["mine_or_other"] = user tmp2["user"] = cost_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_deck[ "place_unique_id" ] self.raise_trigger_monster_change_val(tmp2, change_val_eternal["variable_name"], "cost", change_val_eternal["effect_kind"], cost_user, 1, change_val_eternal["variable_name"]) user_decks[key] = user_deck if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): self.decks[deck_id]["mydeck"] = user_decks elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): self.decks[deck_id]["otherdeck"] = user_decks elif user == 3: self.decks[deck_id]["commondeck"] = user_decks if "grave" in cost["variable"]: for tmp in cost["variable"]["grave"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): user_graves = self.graves[deck_id]["mygrave"] elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): user_graves = self.graves[deck_id]["othergrave"] elif user == 3: user_graves = self.graves[deck_id]["commongrave"] for key in range(len(user_graves)): user_grave = user_graves[key] if place_unique_id == user_grave["place_unique_id"]: change_val_eternal = tmp["change_variable"] if "eternal" not in user_grave: user_grave["eternal"] = [] user_grave["eternal"].append(change_val_eternal) tmp2 = {} tmp2["det"] = user_grave tmp2["mine_or_other"] = user tmp2["user"] = cost_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_grave[ "place_unique_id" ] self.raise_trigger_monster_change_val(tmp2, change_val_eternal["variable_name"], "cost", change_val_eternal["effect_kind"], cost_user, 1, change_val_eternal["variable_name"]) user_graves[key] = user_grave if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): self.graves[deck_id]["mygrave"] = user_graves elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): self.graves[deck_id]["othergrave"] = user_graves elif user == 3: self.graves[deck_id]["commongrave"] = user_graves if "hand" in cost["variable"]: for tmp in cost["variable"]["hand"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): user_hands = self.hands[deck_id]["myhand"] elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): user_hands = self.hands[deck_id]["otherhand"] elif user == 3: user_hands = self.hands[deck_id]["commonhand"] for key in range(len(user_hands)): user_hand = user_hands[key] if place_unique_id == user_hand["place_unique_id"]: change_val_eternal = tmp["change_variable"] if "eternal" not in user_hand: user_hand["eternal"] = [] user_hand["eternal"].append(change_val_eternal) tmp2 = {} tmp2["det"] = user_hand tmp2["mine_or_other"] = user tmp2["user"] = cost_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hand[ "place_unique_id" ] for change_tmp in change_val_eternal["variables"]: self.raise_trigger_monster_change_val(tmp2, change_val_eternal["variables"][change_tmp]["value"], "cost", change_val_eternal["effect_kind"], cost_user, 1, change_tmp) user_hands[key] = user_hand if (user == 1 and 1 == self.user) or (user == 2 and 2 == self.user): self.hands[deck_id]["myhand"] = user_hands elif (user == 2 and 1 == self.user) or ( user == 1 and 2 == self.user ): self.hands[deck_id]["otherhand"] = user_hands elif user == 3: self.hands[deck_id]["commonhand"] = user_hands def end_cost_remove(self, cost_user): if not self.cost_result: return cost = self.cost_result if "remove" in cost: if "field" in cost["remove"]: field = self.field for tmp in cost["remove"]["field"]: x = tmp["x"] y = tmp["y"] place_unique_id = tmp["place_unique_id"] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue else: if field[x][y]["det"]["place_unique_id"] != place_unique_id: continue field[x][y]["det"] = None self.effect += "field_move;"+str(x)+";"+str(y)+"|" self.effect2 += "field_move;"+str(x)+";"+str(y)+"|" if self.config.sort is True: field = self.sortField(field,y) self.field = field if "under" in cost["remove"]: field = self.field for tmp in cost["remove"]["field"]: x = tmp["x"] y = tmp["y"] place_unique_id = tmp["place_unique_id"] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue else: if field[x][y]["det"]["place_unique_id"] != place_unique_id: continue for under in range(len(field[x][y]["det"]["under"])): if ( field[x][y]["det"]["under"][under]["place_unique_id"] == tmp["under_id"] ): field[x][y]["det"]["under"].pop(under) self.field = field if "deck" in cost["remove"]: for tmp in cost["remove"]["deck"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and self.user == 1) or (user == 2 and self.user == 2): user_decks = self.decks[deck_id]["mydeck"] elif (user == 2 and self.user == 1) or (user == 1 and self.user == 2): user_decks = self.decks[deck_id]["otherdeck"] elif user == 3: user_decks = self.decks[deck_id]["commondeck"] for user_deck in user_decks: if place_unique_id == user_deck["place_unique_id"]: user_decks.remove(user_deck) if (user == 1 and self.user == 1) or (user == 2 and self.user == 2): self.decks[deck_id]["mydeck"] = user_decks elif (user == 2 and self.user == 1) or (user == 1 and self.user == 2): self.decks[deck_id]["otherdeck"] = user_decks elif user == 3: self.decks[deck_id]["commondeck"] = user_decks if "grave" in cost["remove"]: for tmp in cost["remove"]["grave"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and self.user == 1) or ( user == 2 and self.user == 2): user_graves = self.graves[deck_id]["mygrave"] elif (user == 2 and self.user == 1) or (user == 1 and self.user == 2): user_graves = self.graves[deck_id]["othergrave"] elif user == 3: user_graves = self.graves[deck_id]["commongrave"] for user_grave in user_graves: if place_unique_id == user_grave["place_unique_id"]: user_graves.remove(user_grave) if (user == 1 and self.user == 1) or (user == 2 and self.user == 2): self.graves[deck_id]["mygrave"] = user_graves elif (user == 2 and self.user == 1) or (user == 1 and self.user == 2): self.graves[deck_id]["othergrave"] = user_graves elif user == 3: self.graves[deck_id]["commongrave"] = user_graves if "hand" in cost["remove"]: for tmp in cost["remove"]["hand"]: deck_id = tmp["deck_id"] user = tmp["user"] place_unique_id = tmp["place_unique_id"] if (user == 1 and self.user == 1) or (user == 2 and self.user == 2): user_hands = self.hands[deck_id]["myhand"] elif (user == 2 and self.user == 1) or (user == 1 and self.user == 2): user_hands = self.hands[deck_id]["otherhand"] elif user == 3: user_hands = self.hands[deck_id]["commonhand"] for user_hand in user_hands: if place_unique_id == user_hand["place_unique_id"]: user_hands.remove(user_hand) if (user == 1 and self.user == 1) or (user == 2 and self.user == 2): self.hands[deck_id]["myhand"] = user_hands elif (user == 2 and self.user == 1) or (user == 1 and self.user == 2): self.hands[deck_id]["otherhand"] = user_hands elif user == 3: self.hands[deck_id]["commonhand"] = user_hands def pay_cost_copy(self, cost, user,org_chain): self.in_execute = True duel = self.duel if cost is None: return None cost_unwrap = cost.cost duel.in_cost = True while copy == 1 and cost_unwrap.effect_flag is False: if cost_unwrap.cost_val == 0: cost_condition = json.loads(cost_unwrap.cost_condition) duel.cost_log += self.write_log(cost.log, user) if self.check_cost_condition(cost_condition, cost.cost_kind): if cost.pac: cost_next = self._pac_cost(cost.pac) else: if cost.cost_next: cost_next = cost.cost_next else: cost_next = self.pop_pac_cost(user) else: if cost.pac2: cost_next = self._pac_cost(cost.pac2) else: if cost.cost_next2: cost_next = cost.cost_next2 else: cost_next = self.pop_pac_cost2(user) else: if cost.pac: cost_next = self._pac_cost(cost.pac) else: if cost.cost_next: cost_next = cost.cost_next else: cost_next = self.pop_pac_cost(user) if not cost_next or cost_next == -2: return None cost = cost_next cost_unwrap = cost.cost return cost def pay_cost_force(self, cost, user,org_chain,trigger): self.in_execute = True duel = self.duel duel.in_copying = True in_copying_org = duel.in_copying chain = duel.chain - 1 self.tmp_chain = chain if cost is None: self.end_cost(user,org_chain,trigger) if self.copying_flag >= 2: if trigger.chain_flag is True: self.duel.virtual_chain += 1 self.duel.chain += 1 return True strategy = cost.strategy strategy_up_or_down = cost.strategy_up_or_down cost_unwrap = cost.cost duel.in_cost = True chain_user_json = json.loads(self.duel.chain_user) chain_user = chain_user_json[str(chain)] if chain_user == 1: chain_no_user = 2 elif chain_user == 2: chain_no_user = 1 duel.cost_det = cost.id if cost_unwrap.cost_val == 5: if self.duel.is_ai is False: self.duel.ask = 3 return False else: if duel.user_turn == 1: self.duel.ask = 1 self.answer_ai(strategy,strategy_up_or_down) else: self.duel.ask = 2 self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 3: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if self.check_monster_exists( cost_text, min, max, chain_user, cost.cost_kind, True, whether_monster, exclude, ): if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 4: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None,True,eternal=True) max = self.calculate_boland(cost_text["max_equation_number"], None,True,eternal=True) if min != 0 or max != 0: if self.check_monster_exists( cost_text, min, max, chain_no_user, cost.cost_kind, True, whether_monster, exclude, ): if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 27 or cost_unwrap.cost_val == 63: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 28 or cost_unwrap.cost_val == 64: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None,True) max = self.calculate_boland(cost_text["max_equation_number"], None,True) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 16: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 26: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 27 or cost_unwrap.cost_val == 63: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 28 or cost_unwrap.cost_val == 64: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None,True) max = self.calculate_boland(cost_text["max_equation_number"], None,True) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) duel.cost_det = cost.id cost_next = self.invoke_cost(cost, chain) if cost_next == -4: return -1 while cost_next and cost_next != -2: pprint(cost_next) if cost_next == -1: return False else: cost_det = cost_next.id duel.cost_det = cost_det cost = cost_next cost_unwrap = cost.cost if cost_unwrap.cost_val == 5: if self.duel.is_ai is False: self.duel.ask = 3 else: if duel.user_turn == 1: self.duel.ask = 1 self.answer_ai(strategy,strategy_up_or_down) else: self.duel.ask = 2 self.answer_ai(strategy,strategy_up_or_down) return False elif cost_unwrap.cost_val == 3: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if self.check_monster_exists( cost_text, min, max, chain_user, cost.cost_kind, True, whether_monster, exclude, ): if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 4: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None,True,eternal=True) max = self.calculate_boland(cost_text["max_equation_number"], None,True,eternal=True) if self.check_monster_exists( cost_text, min, max, chain_no_user, cost_unwrap.cost_kind, cost.cost_kind, True, whether_monster, exclude, ): if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost.unwrap.cost_val == 16: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 26: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 27 or cost_unwrap.cost_val == 63: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 28 or cost_unwrap.cost_val == 64: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None,True) max = self.calculate_boland(cost_text["max_equation_number"], None,True) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) cost_next = self.invoke_cost(cost, chain) if cost_next == -4: return -1 self.end_cost(user,org_chain,trigger) if self.copying_flag >= 2: if trigger.chain_flag is True: self.duel.virtual_chain += 1 self.duel.chain += 1 return True def pay_cost(self, cost, user,org_chain, trigger,copy=0): self.in_execute = True duel = self.duel pprint(cost) if copy != 0: duel.in_copying = True in_copying_org = duel.in_copying if duel.in_copying is True: chain = duel.chain - 1 else: chain = duel.chain self.tmp_chain = str(chain) if cost is None: self.change_once_per_turn() self.end_cost(user,org_chain,trigger,False,copy) if in_copying_org == 0 or self.copying_flag >= 2: if trigger.chain_flag is True: self.duel.virtual_chain += 1 self.duel.chain += 1 return True strategy = cost.strategy strategy_up_or_down = cost.strategy_up_or_down cost_unwrap = cost.cost duel.in_cost = True while copy == 1 and cost_unwrap.effect_flag is False: if cost_unwrap.cost_val == 0: cost_condition = json.loads(cost_unwrap.cost_condition) duel.cost_log += self.write_log(cost.log, user) if self.check_cost_condition(cost_condition, cost.cost_kind): if cost.pac: cost_next = self._pac_cost(cost.pac) else: if cost.cost_next: cost_next = cost.cost_next else: cost_next = self.pop_pac_cost(user) else: if cost.pac2: cost_next = self._pac_cost(cost.pac2) else: if cost.cost_next2: cost_next = cost.cost_next2 else: cost_next = self.pop_pac_cost2(user) else: if cost.pac: cost_next = self._pac_cost(cost.pac) else: if cost.cost_next: cost_next = cost.cost_next else: cost_next = self.pop_pac_cost(user) pprint(cost_next) if not cost_next or cost_next == -2: self.end_cost(user,org_chain,trigger,Flase,copy) if in_copying_org == 0 or self.copying_flag >= 2: if trigger.chain_flag is True: self.duel.virtual_chain += 1 self.duel.chain += 1 return True strategy = cost.strategy strategy_up_or_down = cost.strategy_up_or_down cost_unwrap = cost.cost duel.in_cost = True while copy == 1 and cost_unwrap.effect_flag is False: if cost_unwrap.cost_val == 0: cost_condition = json.loads(cost_unwrap.cost_condition) duel.cost_log += self.write_log(cost.log, user) if self.check_cost_condition(cost_condition, cost.cost_kind): if cost.pac: cost_next = self._pac_cost(cost.pac) else: if cost.cost_next: cost_next = cost.cost_next else: cost_next = self.pop_pac_cost(user) else: if cost.pac2: cost_next = self._pac_cost(cost.pac2) else: if cost.cost_next2: cost_next = cost.cost_next2 else: cost_next = self.pop_pac_cost2(user) else: if cost.pac: cost_next = self._pac_cost(cost.pac) else: if cost.cost_next: cost_next = cost.cost_next else: cost_next = self.pop_pac_cost(user) if not cost_next or cost_next == -2: self.end_cost(user,org_chain,trigger,Flase,copy) if in_copying_org == 0 or self.copying_flag >= 2: if trigger.chain_flag is True: self.duel.virtual_chain += 1 self.duel.chain += 1 self.change_once_per_turn() return True cost = cost_next cost_unwrap = cost.cost chain_user_json = json.loads(self.duel.chain_user) chain_user = chain_user_json[str(chain)] if chain_user == 1: chain_no_user = 2 elif chain_user == 2: chain_no_user = 1 self.duel.cost_det = cost.id if cost_unwrap.cost_val == 5: if self.duel.is_ai is False: self.duel.ask = 3 else: if duel.user_turn == 1: self.duel.ask = 1 self.answer_ai(strategy,strategy_up_or_down) else: self.duel.ask = 2 self.answer_ai(strategy,strategy_up_or_down) return False elif cost_unwrap.cost_val == 3: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if self.check_monster_exists( cost_text, min, max, chain_user, cost.cost_kind, True, whether_monster, exclude, ): if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True elif cost_unwrap.cost_val == 4: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None,True,eternal=True) max = self.calculate_boland(cost_text["max_equation_number"], None,True,eternal=True) if min != 0 or max != 0: if self.check_monster_exists( cost_text, min, max, chain_no_user, cost.cost_kind, True, whether_monster, exclude, ): if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True elif cost_unwrap.cost_val == 27 or cost_unwrap.cost_val == 63: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True elif cost_unwrap.cost_val == 28 or cost_unwrap.cost_val == 64: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None, True) max = self.calculate_boland(cost_text["max_equation_number"], None, True) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True elif cost_unwrap.cost_val == 16: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 26: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 27 or cost_unwrap.cost_val == 63: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True elif cost_unwrap.cost_val == 28 or cost_unwrap.cost_val == 64: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True duel.cost_det = cost.id cost_next = self.invoke_cost(cost, chain) if cost_next == -4: return -1 while cost_next and cost_next != -2 and cost_next != -3: pprint(cost_next) if cost_next == -1: return False else: cost_det = cost_next.id duel.cost_det = cost_det cost = cost_next cost_unwrap = cost.cost if copy == 1 and cost_unwrap.effect_flag is False: if cost.pac: cost_next = self._pac_cost(cost.pac) else: if cost.cost_next: cost_next = cost.cost_next else: cost_next = self.pop_pac_cost(user) continue if cost_unwrap.cost_val == 5: if self.duel.is_ai is False: self.duel.ask = 3 else: if duel.user_turn == 1: self.duel.ask = 1 self.answer_ai(strategy,strategy_up_or_down) else: self.duel.ask = 2 self.answer_ai(strategy,strategy_up_or_down) return False elif cost_unwrap.cost_val == 3: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if self.check_monster_exists( cost_text, min, max, chain_user, cost.cost_kind, True, whether_monster, exclude, ): if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True elif cost_unwrap.cost_val == 4: cost_text = json.loads(cost_unwrap.cost) whether_monster = cost_text["whether_monster"] exclude = cost_text["exclude"] cost_text = cost_text["monster"][0] min = self.calculate_boland(cost_text["min_equation_number"], None,True,eternal=True) max = self.calculate_boland(cost_text["max_equation_number"], None,True,eternal=True) if self.check_monster_exists( cost_text, min, max, chain_no_user, cost_unwrap.cost_kind, cost.cost_kind, True, whether_monster, exclude, ): if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True elif cost_unwrap.cost_val == 16: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 26: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 27 or cost_unwrap.cost_val == 63: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None) max = self.calculate_boland(cost_text["max_equation_number"], None) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 return False else: self.answer_ai(strategy,strategy_up_or_down) elif cost_unwrap.cost_val == 28 or cost_unwrap.cost_val == 64: cost_text = json.loads(cost_unwrap.cost) min = self.calculate_boland(cost_text["min_equation_number"], None,True) max = self.calculate_boland(cost_text["max_equation_number"], None,True) if min != 0 or max != 0: if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 return False else: self.answer_ai(strategy,strategy_up_or_down) else: self.invoke_flag = True cost_next = self.invoke_cost(cost, chain) if cost_next == -4: return -1 self.end_cost(user,org_chain,trigger) # -3はcopy_special_effectでコピーした時 if (in_copying_org == 0 or self.copying_flag >=2) and cost_next != -3: if trigger.chain_flag is True: self.duel.virtual_chain += 1 self.duel.chain += 1 self.change_once_per_turn() return True def invoke_force_trigger( self, trigger, place, trigger_monster, mine_or_other, user, deck_id, x=0, y=0, monster_from=None, place_from=None, deck_id_from=None, from_x=None, from_y=None, ): duel = self.duel chain = duel.chain-1 chain_user_json = {} if place != "": variable_mess = self.variable_mess variable_mess[str(chain)] = 0 self.variable_mess = variable_mess tmp = self.mess tmp2 = {} tmp2["x"] = x tmp2["y"] = y tmp2["from_x"] = from_x tmp2["from_y"] = from_y tmp2["deck_id_from"] = deck_id_from tmp2["place_from"] = place_from if monster_from is not None: tmp2["place_unique_id_from"] = monster_from["place_unique_id"] else: tmp2["place_unique_id_from"] = None tmp2["det_from"] = monster_from tmp2["det"] = trigger_monster tmp2["place_unique_id"] = trigger_monster["place_unique_id"] tmp2["card_unique_id"] = trigger_monster["card_unique_id"] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = user tmp2["place"] = place tmp2["deck_id"] = deck_id tmp[str(chain)] = {} tmp[str(chain)]["trigger"] = [] tmp[str(chain)]["trigger"].append(tmp2) tmp[str(chain)]["trigger_org"] = [] tmp[str(chain)]["trigger_org"].append(tmp2) if monster_from is not None: tmp_from = {} tmp_from["x"] = from_x tmp_from["y"] = from_y tmp_from["deck_id"] = deck_id_from tmp_from["place"] = place_from tmp_from["place_unique_id"] = monster_from["place_unique_id"] tmp_from["det"] = monster_from tmp[str(chain)]["trigger_from"] = [] tmp[str(chain)]["trigger_from"].append(tmp2) tmp_cost = self.cost tmp_cost[str(chain)] = {} tmp_cost[str(chain)]["~trigger"] = [] tmp_cost[str(chain)]["~trigger"].append(tmp2) tmp_cost[str(chain)]["~trigger_org"] = [] tmp_cost[str(chain)]["~trigger_org"].append(tmp2) self.mess = tmp tmp_cost[str(chain)]["trigger_relate"] = [] tmp_cost[str(chain)]["trigger_relate"].append(tmp2) tmp_cost[str(chain)]["trigger_org_relate"] = [] tmp_cost[str(chain)]["trigger_org_relate"].append(tmp2) self.cost = tmp_cost else: variable_mess = self.variable_mess variable_mess[str(chain)] = 0 self.variable_mess = variable_mess tmp = self.mess tmp[str(chain)] = {} self.mess = tmp tmp_cost = self.cost tmp_cost[str(chain)] = {} self.cost = tmp_cost tmp2 = None duel.ask = 0 if self.duel.chain_user != "": chain_user_json = json.loads(self.duel.chain_user) chain_user_json[str(chain)] = user self.duel.chain_user = json.dumps(chain_user_json) if trigger.trigger_cost_pac is not None: cost = self._pac_cost(trigger.trigger_cost_pac) else: cost = trigger.trigger_cost self.duel.cost_user = user copied_cost = self.pay_cost_force(cost, user,duel.chain,trigger) chain_det_json = {} chain_det_trigger_json = {} if self.duel.chain_det != "": chain_det_json = json.loads(self.duel.chain_det) if self.duel.chain_det_trigger != "": chain_det_trigger_json = json.loads(self.duel.chain_det_trigger) if trigger.pac: effect = self._pac(trigger.pac) else: effect = trigger.next_effect if effect is not None: chain_det_json[str(chain)] = effect.id else: chain_det_json[str(chain)] = 0 self.duel.chain_det = json.dumps(chain_det_json) self.duel.log_turn += self.write_log(trigger_monster["monster_name"]+"を使った",user) self.duel.log += self.write_log(trigger_monster["monster_name"]+"を使った",user) self.current_log += self.write_log(trigger_monster["monster_name"]+"を使った",user) return copied_cost def invoke_copy_trigger( self, trigger, place, trigger_monster, mine_or_other, user, deck_id, x=0, y=0, monster_from=None, place_from=None, deck_id_from=None, from_x=None, from_y=None, ): duel = self.duel org_chain = self.tmp_chain chain_user_json = {} if self.duel.chain_user != "": chain_user_json = json.loads(self.duel.chain_user) chain_user_json[str(org_chain)] = user self.duel.chain_user = json.dumps(chain_user_json) cost = trigger.trigger_cost self.duel.cost_user = user copied_cost = self.pay_cost_copy(cost, user,org_chaintrigger) chain_det_json = {} chain_det_trigger_json = {} if self.duel.chain_det != "": chain_det_json = json.loads(self.duel.chain_det) if self.duel.chain_det_trigger != "": chain_det_trigger_json = json.loads(self.duel.chain_det_trigger) if trigger.pac: effect = self._pac(trigger.pac) else: effect = trigger.next_effect if effect is not None: chain_det_json[str(org_chain)] = effect.id else: chain_det_json[str(org_chain)] = 0 self.duel.chain_det = json.dumps(chain_det_json) duel.cost_det = copied_cost return copied_cost def invoke_trigger( self, trigger, place, trigger_monster, mine_or_other, user, deck_id, x=0, y=0, monster_from=None, place_from=None, deck_id_from=None, from_x=None, from_y=None, copy=0, null_relate=None, change_val=0, place_relate=None, monster_relate=None, mine_or_other_relate=None, deck_id_relate=None, x_relate=None, y_relate=None, move_from_relate=None, place_from_relate=None, deck_id_from_relate=None, from_x_relate=None, from_y_relate=None, place_exist=None, monster_exist=None, mine_or_other_exist=None, deck_id_exist=None, x_exist=None, y_exist=None, copy_flag = False, who=0, waiting = False ): if user == 1: other_user = 2 else: other_user = 1 if trigger.immidiate_flag is True: self.do_immidiate_trigger(trigger,user) return; self.duel.none = False duel = self.duel if copy == 0 or self.copying_flag >= 2: org_chain = duel.chain else: org_chain = duel.chain - 1 chain_user_json = {} if self.duel.chain_user != "": chain_user_json = json.loads(self.duel.chain_user) chain_user_json[str(org_chain)] = user self.duel.chain_user = json.dumps(chain_user_json) if copy_flag == False: if user == 1: self.duel.tmponce_per_turn1 = str(trigger.id) else: self.duel.tmponce_per_turn2 = str(trigger.id) if user == 1: self.duel.tmponce_per_duel1 = str(trigger.id) else: self.duel.tmponce_per_duel2 = str(trigger.id) if trigger.once_per_turn_group != 0: if user == 1: self.duel.tmponce_per_turn_group1 = str(trigger.once_per_turn_group) else: self.duel.tmponce_per_turn_group2 = str(trigger.once_per_turn_group) if place != "": if copy_flag == False: if user == 1: self.duel.tmponce_per_turn_monster1 = str(trigger.id)+"*"+ trigger_monster["place_unique_id"] else: self.duel.tmponce_per_turn_monster2 = str(trigger.id)+"*"+ trigger_monster["place_unique_id"] if trigger.once_per_turn_monster_group != 0: if user == 1: self.duel.tmponce_per_turn_monster_group1 = str(trigger.once_per_turn_monster_group)+"*"+str( trigger_monster["place_unique_id"]) else: self.duel.tmponce_per_turn_monster_group2 = str(trigger.once_per_turn_monster_group)+"*"+str(trigger_monster["place_unique_id"]) variable_mess = self.variable_mess variable_mess[str(org_chain)] = change_val self.variable_mess = variable_mess tmp = self.mess tmp2 = {} tmp2["x"] = x tmp2["y"] = y tmp2["from_x"] = from_x tmp2["from_y"] = from_y tmp2["deck_id_from"] = deck_id_from tmp2["place_from"] = place_from if monster_from is not None: tmp2["place_unique_id_from"] = monster_from["place_unique_id"] else: tmp2["place_unique_id_from"] = None tmp2["det_from"] = monster_from tmp2["det"] = trigger_monster tmp2["place_unique_id"] = trigger_monster["place_unique_id"] tmp2["card_unique_id"] = trigger_monster["card_unique_id"] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = user tmp2["place"] = place tmp2["deck_id"] = deck_id tmp[str(org_chain)] = {} tmp[str(org_chain)]["trigger"] = [] tmp[str(org_chain)]["trigger"].append(tmp2) tmp[str(org_chain)]["trigger_org"] = [] tmp[str(org_chain)]["trigger_org"].append(tmp2) if who == 0: tmp[str(org_chain)]["trigger_all"] = [] tmp[str(org_chain)]["trigger_all"].append(tmp2) tmp_cost = self.cost tmp_cost[str(org_chain)] = {} tmp_cost[str(org_chain)]["~trigger"] = [] tmp_cost[str(org_chain)]["~trigger"].append(tmp2) tmp_cost[str(org_chain)]["~trigger_org"] = [] tmp_cost[str(org_chain)]["~trigger_org"].append(tmp2) if who == 0: tmp_cost[str(org_chain)]["~trigger_all"] = [] tmp_cost[str(org_chain)]["~trigger_all"].append(tmp2) if monster_from is not None: tmp_from = {} tmp_from["x"] = from_x tmp_from["y"] = from_y tmp_from["deck_id"] = deck_id_from tmp_from["place"] = place_from tmp_from["place_unique_id"] = monster_from["place_unique_id"] tmp_from["det"] = monster_from tmp[str(org_chain)]["trigger_from"] = [] tmp[str(org_chain)]["trigger_from"].append(tmp_from) if null_relate is not None: tmp[str(org_chain)]["null_relate"] = [] tmp[str(org_chain)]["null_relate"].append(null_relate) if monster_relate is not None: ''' if user == 1: duel.tmponce_per_turn_relate1 = monster_relate["place_unique_id"] else: duel.tmponce_per_turn_relate2 = monster_relate["place_unique_id"] ''' tmp2 = {} tmp2["x"] = x_relate tmp2["y"] = y_relate tmp2["from_x"] = from_x_relate tmp2["from_y"] = from_y_relate tmp2["deck_id_from"] = deck_id_from_relate tmp2["place_from"] = place_from_relate if move_from_relate is not None: tmp2["place_unique_id_from"] = move_from_relate["det"][ "place_unique_id" ] else: tmp2["place_unique_id_from"] = None tmp2["det_from"] = move_from_relate tmp2["det"] = monster_relate tmp2["place_unique_id"] = monster_relate["place_unique_id"] tmp2["card_unique_id"] = monster_relate["card_unique_id"] tmp2["mine_or_other"] = mine_or_other_relate tmp2["user"] = user tmp2["place"] = place_relate tmp2["deck_id"] = deck_id_relate tmp[str(org_chain)]["trigger_relate"] = [] tmp[str(org_chain)]["trigger_relate"].append(tmp2) tmp[str(org_chain)]["trigger_org_relate"] = [] tmp[str(org_chain)]["trigger_org_relate"].append(tmp2) tmp_cost[str(org_chain)]["~trigger_relate"] = [] tmp_cost[str(org_chain)]["~trigger_relate"].append(tmp2) tmp_cost[str(org_chain)]["~trigger_org_relate"] = [] tmp_cost[str(org_chain)]["~trigger_org_relate"].append(tmp2) if who == 2: tmp_cost[str(org_chain)]["~trigger_all"] = [] tmp_cost[str(org_chain)]["~trigger_all"].append(tmp2) tmp[str(org_chain)]["trigger_all"] = [] tmp[str(org_chain)]["trigger_all"].append(tmp2) if monster_exist is not None: ''' if user == 1: duel.tmponce_per_turn_exist1 = monster_exist["place_unique_id"] else: duel.tmponce_per_turn_exist2 = monster_exist["place_unique_id"] ''' tmp2["x"] = x_exist tmp2["y"] = y_exist tmp2["det"] = monster_exist tmp2["place_unique_id"] = monster_exist["place_unique_id"] tmp2["card_unique_id"] = monster_exist["card_unique_id"] tmp2["mine_or_other"] = mine_or_other_exist tmp2["user"] = user tmp2["place"] = place_exist tmp2["deck_id"] = deck_id_exist tmp[str(org_chain)]["trigger_exist"] = [] tmp[str(org_chain)]["trigger_exist"].append(tmp2) tmp[str(org_chain)]["trigger_org_exist"] = [] tmp[str(org_chain)]["trigger_org_exist"].append(tmp2) tmp_cost[str(org_chain)]["trigger_exist"] = [] tmp_cost[str(org_chain)]["trigger_exist"].append(tmp2) tmp_cost[str(org_chain)]["trigger_org_exist"] = [] tmp_cost[str(org_chain)]["trigger_org_exist"].append(tmp2) if who == 1: tmp_cost[str(org_chain)]["~trigger_all"] = [] tmp_cost[str(org_chain)]["~trigger_all"].append(tmp2) tmp[str(org_chain)]["trigger_all"] = [] tmp[str(org_chain)]["trigger_all"].append(tmp2) self.mess = tmp self.cost = tmp_cost else: variable_mess = self.variable_mess variable_mess[str(org_chain)] = change_val self.variable_mess = variable_mess tmp = self.mess tmp[str(org_chain)] = {} if null_relate is not None: tmp[str(org_chain)]["null_relate"] = [] tmp[str(org_chain)]["null_relate"].append(null_relate) self.mess = tmp tmp_cost = self.cost tmp_cost[str(org_chain)] = {} self.cost = tmp_cost tmp2 = None data = {} data["monsters"] = [] data["monsters"].append(tmp2) self.duel.trigger_log = self.write_log(trigger.log, user, data) flag = True if trigger.trigger_cost_pac is not None: cost = self._pac_cost(trigger.trigger_cost_pac) else: cost = trigger.trigger_cost self.duel.cost_user = user self.duel.current_trigger = trigger.id flag = self.pay_cost(cost, user,org_chain, trigger,copy) if flag == -1: return -1 chain_det_json = {} chain_det_trigger = {} if self.duel.chain_det != "": chain_det_json = json.loads(self.duel.chain_det) if self.duel.chain_det_trigger != "": chain_det_trigger_json = json.loads(self.duel.chain_det_trigger) if trigger.pac: effect = self._pac(trigger.pac, org_chain) else: effect = trigger.next_effect if effect is not None: chain_det_json[str(org_chain)] = effect.id else: chain_det_json[str(org_chain)] = 0 self.duel.chain_det = json.dumps(chain_det_json) ''' if copy == 0: self.duel.canbechained = trigger.canbechained else: self.duel.canbechained = False ''' if flag: if duel.appoint == other_user: duel.appoint = user else: duel.appoint = other_user return flag def check_trigger(self, decks, graves, hands, phase, turn, user, other_user,force_flag=0): duel = self.duel force_count = 0 return_value = [] if duel.canbechained is False: return_value.append(None) if duel.current_priority > 1: return_value.append(1) else: return_value.append(0) return return_value available_trigger = [] triggers = Trigger.objects.filter(Q(phase__isnull=True) | Q(phase=phase)) if duel.is_ai is False: triggers = triggers.filter( Q(enemy = 0) | Q(enemy = 1) ) else: triggers = triggers.filter( Q(enemy = 1) | Q(enemy = 2) ) triggers = triggers.filter( Q(chain__isnull=True) | (Q(chain_kind=0) & Q(chain__lte=duel.virtual_chain)) | (Q(chain_kind=1) & Q(chain__gte=duel.virtual_chain)) | (Q(chain_kind=2) & Q(chain=duel.virtual_chain)) ) if duel.timing is not None: triggers = triggers.filter(Q(timing=duel.timing)) else: triggers = triggers.filter(Q(none_timing=True)) if duel.timing2 is not None: triggers = triggers.filter(Q(timing2=duel.timing2)) else: triggers = triggers.filter(Q(none_timing2=True)) if duel.timing3 is not None: triggers = triggers.filter(Q(timing3=duel.timing3)) else: triggers = triggers.filter(Q(none_timing3=True)) triggers = triggers.filter(priority__lt=duel.current_priority) triggers = triggers.filter(trigger_timing=False) #if user == duel.user_turn: # triggers = triggers.filter(Q(turn=0) | Q(turn=1)) #else: # triggers = triggers.filter(Q(turn=0) | Q(turn=2)) if duel.is_ai is True: if user == 1: triggers = triggers.filter(Q(enemy_own = 0) | Q(enemy_own = 1)) else: triggers = triggers.filter(Q(enemy_own = 1) | Q(enemy_own = 2)) else: triggers = triggers.filter(Q(enemy_own = 0) | Q(enemy_own = 1)) triggers = triggers.order_by("-priority").all() trigger_first = triggers.first() pprint(trigger_first) if trigger_first is None: if force_flag == 1: return 0 return_value.append(None) return_value.append(0) return_value.append(0) return return_value priority = trigger_first.priority none_triggers = triggers.filter(priority=priority, trigger_none_monster=True) for trigger in none_triggers: if not self.check_launch_trigger( trigger, self.duel.phase, self.duel.user_turn, user, other_user, user): continue if self.check_trigger_condition(trigger, user): tmp = {} if force_flag == 2: self.invoke_trigger( trigger, "", "", "", self.duel.user_turn, "",who=0 ) return if trigger.force >= 1 or (duel.is_ai is True and user == 2): tmp["force"] = True force_count+=1 else: tmp["force"] = False tmp["sentence"] = trigger.trigger_sentence tmp["id"] = trigger.id available_trigger.append(tmp) if force_flag == 1: return force_count trigger_monster = self.check_monster_trigger( decks, graves, hands, user, other_user, priority,1 ) trigger_num = trigger_monster[0] force_count += trigger_monster[1] self.update = True self.trigger_waiting_for_ai = [] if len(available_trigger) > 1 and (self.duel.is_ai is False or user == 1): return_value.append(available_trigger) return_value.append(priority) return_value.append(force_count) return return_value elif len(available_trigger) > 1 and (self.duel.is_ai is True and user == 2): flag = False for a in available_trigger: # if a["force"] is True or (user == 2 and duel.is_ai is True): flag = True force_trigger = Trigger.objects.get(id=a["id"]) if force_trigger.timing_trigger: return_value.append( self.invoke_trigger( force_trigger, "", "", "", self.duel.user_turn, "",who=0 ) ) else: trigger_waitings = json.loads(duel.trigger_waiting) tmp = {} tmp["monster"] = "" tmp["move_from"] = None tmp["trigger"] = force_trigger.id tmp["priority"] = force_trigger.priority tmp["storategy_priority"] = force_trigger.storategy_priority tmp["mine_or_other"] = user tmp["user"] = user tmp["place"] = "" tmp["deck_id"] = "" tmp["place_from"] = "" tmp["deck_id_from"] = "" tmp["x"] = 0 tmp["y"] = 0 tmp["from_x"] = 0 tmp["from_y"] = 0 tmp["strategy_value"] = 0 trigger_waitings.append(tmp) duel.trigger_waiting = json.dumps(trigger_waitings) duel.in_trigger_waiting = True duel.in_cost_force = True if flag is True: return_value.append(True) else: return_value.append(None) return_value.append(priority) return_value.append(force_count) return return_value self.update = True elif len(available_trigger) == 1 and trigger_num is False: if available_trigger[0]["force"] is True or (user == 2 and duel.is_ai is True): force_trigger = Trigger.objects.get(id=available_trigger[0]["id"]) if force_trigger.timing_trigger: return_value.append( self.invoke_trigger( force_trigger, "", "", "", self.duel.user_turn, "",who=0 ) ) else: trigger_waitings = json.loads(duel.trigger_waiting) tmp = {} tmp["monster"] = "" tmp["move_from"] = None tmp["trigger"] = force_trigger.id tmp["priority"] = force_trigger.priority tmp["storategy_priority"] = force_trigger.storategy_priority tmp["mine_or_other"] = user tmp["user"] = user tmp["place"] = "" tmp["deck_id"] = "" tmp["place_from"] = "" tmp["deck_id_from"] = "" tmp["x"] = 0 tmp["y"] = 0 tmp["from_x"] = 0 tmp["from_y"] = 0 tmp["strategy_value"] = 0 if not self.check_launch_trigger(force_trigger, self.duel.phase, self.duel.user_turn, user, other_user, user): return_value.append(None) return_value.append(priority) return_value.append(0) return return_value trigger_waitings.append(tmp) duel.trigger_waiting = json.dumps(trigger_waitings) duel.in_trigger_waiting = True duel.in_cost_force = True #return_value.append(True) self.update = True return_value.append(available_trigger) return_value.append(priority) return_value.append(force_count) return return_value else: return_value.append(available_trigger) return_value.append(priority) return_value.append(force_count) return return_value elif len(available_trigger) == 1 and trigger_num is True: if available_trigger[0]["force"] is True or (user == 2 and duel.is_ai is True): force_trigger = Trigger.objects.get(id=available_trigger[0]["id"]) if force_trigger.timing_trigger: return_value.append( self.invoke_trigger( force_trigger, "", "", "", self.duel.user_turn, "",who=0 ) ) else: trigger_waitings = json.loads(duel.trigger_waiting) tmp = {} tmp["monster"] = "" tmp["move_from"] = None tmp["trigger"] = force_trigger.id tmp["priority"] = force_trigger.priority tmp["storategy_priority"] = force_trigger.storategy_priority tmp["mine_or_other"] = user tmp["user"] = user tmp["place"] = "" tmp["deck_id"] = "" tmp["place_from"] = "" tmp["deck_id_from"] = "" tmp["x"] = 0 tmp["y"] = 0 tmp["from_x"] = 0 tmp["from_y"] = 0 tmp["strategy_value"] = 0 if not self.check_launch_trigger(force_trigger, self.duel.phase, self.duel.user_turn, user, other_user, user): return_value.append(None) return_value.append(priority) return_value.append(0) return return_value trigger_waitings.append(tmp) duel.trigger_waiting = json.dumps(trigger_waitings) duel.in_trigger_waiting = True duel.in_cost_force = True return_value.append(True) self.update = True return_value.append(priority) if duel.appoint == 2 and duel.is_ai == True and duel.trigger_force != "[]": self.invoke_trigger_waiting(None,0,2) return return_value return_value.append(available_trigger) return_value.append(priority) return_value.append(force_count) return return_value elif len(available_trigger) == 0 and trigger_num is False: return_value.append(None) return_value.append(priority) return_value.append(0) return return_value else: return_value.append("monster_trigger") return_value.append(priority) return_value.append(force_count) if duel.appoint == 2 and duel.is_ai is True: self.invoke_trigger_waiting(None,0,2) return return_value return return_value def check_monster_trigger(self, decks, graves, hands, user, other_user, priority,mode2 = 0): flag = False return_value = {} force_count = 0 deck_info = self.get_deck_info(decks, user, other_user) return_value["deck_info"] = copy.deepcopy(deck_info) tmp = self.modify_deck_info( return_value["deck_info"], self.count_deck(decks), user, other_user, priority, 1,mode2 ) if tmp[0] is True: flag = True force_count += tmp[1] grave_info = self.get_grave_info(graves, user, other_user) return_value["grave_info"] = copy.deepcopy(grave_info) tmp = self.modify_grave_info( return_value["grave_info"], graves.count(), user, other_user, priority, 1,mode2 ) if tmp[0] is True: flag = True force_count += tmp[1] hand_info = self.get_hand_info(hands, user, other_user) return_value["hand_info"] = copy.deepcopy(hand_info) tmp = self.modify_hand_info( return_value["hand_info"], hands.count(), user, other_user, priority, 1,mode2 ) if tmp[0] is True: flag = True force_count += tmp[1] field = copy.deepcopy(self.field) tmp = self.modify_field_info(field, user, other_user, priority, 1) if tmp[0] is True: flag = True force_count += tmp[1] return [flag,force_count] def init_all(self, user, other_user, room_number,mode=0): self.trigger_waiting_for_ai = False self.turn_changed = False self.tmp_val = {} self.init_deck_info(user, other_user, room_number) self.init_grave_info(user, other_user, room_number) self.init_hand_info(user, other_user, room_number) self.init_virtual_variable(user, other_user, room_number) self.triggers = {} self.copying_flag = 0 duel = self.duel if hasattr(self,"sound_effect"): pass else: self.sound_effect = "" #pprint(self.effect) self.effect = duel.effect self.effect2 = duel.effect2 ''' if(duel.change_turn_flag is True): else: if user == 1: self.effect = "&" self.effect2 = duel.effect2 else: self.effect = duel.effect self.effect2 = "&" ''' # ターン変動ではないがデックトリガの時必要 if mode == 1: duel.change_turn_flag = True else: duel.change_turn_flag = False self.log_initial = duel.current_log self.current_log = "" self.in_execute = duel.in_execute self.field = json.loads(duel.field) self.mess = json.loads(duel.mess) self.variable_mess = json.loads(duel.variable_mess) self.cost = json.loads(duel.cost) self.cost_result = json.loads(duel.cost_result) self.timing_mess = json.loads(duel.timing_mess) self.config = Config.objects.get() self.field_free = self.config.field_free limit_time = self.config.limit_time time_win = self.config.time_win self.tmp_chain = 0 self.acc_global = json.loads(duel.accumulate_global) if user == duel.appoint or (duel.user_turn == other_user and duel.ask == 2) or (duel.user_turn == 1 and duel.ask ==1) or duel.ask == 3: if user == 1: if time() - duel.time_1 > limit_time: duel.log_turn += self.write_log(time_win, other_user) duel.log += self.write_log(time_win, other_user) self.current_log += self.write_log(time_win, other_user) self.lose_the_game_by_time() else: if time() - duel.time_2 > limit_time: duel.log_turn += self.write_log(time_win, other_user) duel.log += self.write_log(time_win, other_user) self.current_log += self.write_log(time_win, other_user) self.lose_the_game_by_time() else: if user == 1: if time() - duel.time_1 > limit_time: duel.log_turn += self.write_log(time_win, user) duel.log += self.write_log(time_win, user) self.current_log += self.write_log(time_win, user) self.win_the_game_by_time() else: if time() - duel.time_2 > limit_time: duel.log_turn += self.write_log(time_win, user) duel.log += self.write_log(time_win, user) self.current_log += self.write_log(time_win, user) self.win_the_game_by_time() def save_all(self, user, other_user, room_number): duel = self.duel game_name = self.config.game_name pwd = os.path.dirname(__file__) if user == 1: duel.effect = "&" duel.effect2 = self.effect2 else: duel.effect = self.effect duel.effect2 = "&" if duel.cost_det is None: duel.cost_det = 0 if self.config.cheat is True or self.config.detail_log is True or (self.turn_changed is True and self.config.initial_turn_log is True): self.log = open(pwd + "/logger_" + game_name, mode="a", encoding="utf-8") if(self.turn_changed is True): if self.duel.user_turn == 1: self.log2 = open(pwd + "/logger2_" + game_name, mode="w", encoding="utf-8") else: self.log2 = open(pwd + "/logger3_" + game_name, mode="w", encoding="utf-8") self.log.write("-----------------------\n") self.save_deck_info(user, other_user, room_number) self.save_grave_info(user, other_user, room_number) self.save_hand_info(user, other_user, room_number) if self.current_log != "": duel.current_log = self.current_log duel.log_turn = duel.log_turn duel.log = duel.log duel.variable_mess = json.dumps(self.variable_mess) duel.mess = json.dumps(self.mess) duel.cost = json.dumps(self.cost) duel.cost_result = json.dumps(self.cost_result) duel.timing_mess = json.dumps(self.timing_mess) duel.field = json.dumps(self.field) duel.in_execute = self.in_execute duel.accumulate_global = json.dumps(self.acc_global) reset_queries() duel.time_1 = time() duel.time_2 = time() duel.save() if self.config.cheat is True or self.config.detail_log is True or (self.turn_changed is True and self.config.initial_turn_log is True): self.log_write() self.log.close() def log_write(self): if self.config.detail_log is True or (self.turn_changed is True and self.config.initial_turn_log is True): for history in connection.queries: self.log.write(history["sql"] + ";\n") if self.config.cheat is True and self.turn_changed is True : for history in connection.queries: self.log2.write(history["sql"] + ";\n") reset_queries() return def save_deck_info(self, user, other_user, room_number): decks = self.deck_structure i = 0 for deck in decks: if deck.mine_or_other == 1: tmp = DuelDeck.objects.filter( room_number=room_number, mine_or_other=3, deck_id=i + 1 ).first() if tmp is None: continue tmp.deck_content = json.dumps(self.decks[i + 1]["commondeck"]) reset_queries() tmp.save() self.log_write() else: tmp = DuelDeck.objects.filter( room_number=room_number, mine_or_other=user, deck_id=i + 1 ).first() if tmp is None: continue tmp.deck_content = json.dumps(self.decks[i + 1]["mydeck"]) reset_queries() tmp.save() self.log_write() tmp = DuelDeck.objects.filter( room_number=room_number, mine_or_other=other_user, deck_id=i + 1 ).first() if tmp is None: continue tmp.deck_content = json.dumps(self.decks[i + 1]["otherdeck"]) reset_queries() tmp.save() self.log_write() i += 1 def save_grave_info(self, user, other_user, room_number): graves = self.grave_structure i = 0 for grave in graves: if grave.mine_or_other == 1: tmp = DuelGrave.objects.filter( room_number=room_number, mine_or_other=3, grave_id=i + 1 ).first() tmp.grave_content = json.dumps(self.graves[i + 1]["commongrave"]) reset_queries() tmp.save() self.log_write() else: tmp = DuelGrave.objects.filter( room_number=room_number, mine_or_other=user, grave_id=i + 1 ).first() tmp.grave_content = json.dumps(self.graves[i + 1]["mygrave"]) reset_queries() tmp.save() self.log_write() tmp = DuelGrave.objects.filter( room_number=room_number, mine_or_other=other_user, grave_id=i + 1 ).first() tmp.grave_content = json.dumps(self.graves[i + 1]["othergrave"]) reset_queries() tmp.save() self.log_write() i += 1 def save_hand_info(self, user, other_user, room_number): hands = self.hand_structure i = 0 for hand in hands: if hand.mine_or_other == 1: tmp = DuelHand.objects.filter( room_number=room_number, mine_or_other=3, hand_id=i + 1 ).first() tmp.hand_content = json.dumps(self.hands[i + 1]["commonhand"]) reset_queries() tmp.save() self.log_write() else: tmp = DuelHand.objects.filter( room_number=room_number, mine_or_other=user, hand_id=i + 1 ).first() tmp.hand_content = json.dumps(self.hands[i + 1]["myhand"]) reset_queries() tmp.save() self.log_write() tmp = DuelHand.objects.filter( room_number=room_number, mine_or_other=other_user, hand_id=i + 1 ).first() tmp.hand_content = json.dumps(self.hands[i + 1]["otherhand"]) reset_queries() tmp.save() self.log_write() i += 1 def init_virtual_variable(self, user, other_user, room_number): virtual_variables = VirtualVariable.objects.all() result_virtual_variables = {} for virtual_variable in virtual_variables: tmp = {} tmp["variable_name"] = virtual_variable.variable_name tmp["priority"] = virtual_variable.priority tmp["1_show"] = virtual_variable.show tmp["2_show"] = virtual_variable.show tmp["mine_or_other"] = virtual_variable.mine_or_other if virtual_variable.mine_or_other == 0: if self.user == 1: tmp["1_value"] = self.calculate_boland(virtual_variable.value,user=1) tmp["2_value"] = self.calculate_boland( virtual_variable.value, None, True,user=1 ) else: tmp["1_value"] = self.calculate_boland( virtual_variable.value, None, True,user = 2 ) tmp["2_value"] = self.calculate_boland(virtual_variable.value, None,user=2) else: tmp["value"] = self.calculate_boland(virtual_variable.value) result_virtual_variables[virtual_variable.variable_name] = tmp self.virtual_variables = result_virtual_variables def init_deck_info(self, user, other_user, room_number): self.deck_structure = Deck.objects.all() decks = self.deck_structure i = 0 result_decks = [] result_decks.append(None) for deck in decks: result_decks.append({}) result_decks[i + 1]["deck_name"] = deck.deck_name if deck.mine_or_other == 1: tmp = DuelDeck.objects.filter( room_number=room_number, mine_or_other=3, deck_id=i + 1 ).first() result_decks[i + 1]["deck_name"] = tmp.deck_name if tmp is not None: tmp = json.loads(tmp.deck_content) result_decks[i + 1]["commondeck"] = tmp else: result_decks[i + 1]["commondeck"] = [] else: tmp = DuelDeck.objects.filter( room_number=room_number, mine_or_other=user, deck_id=i + 1 ).first() result_decks[i + 1]["deck_name"] = tmp.deck_name if tmp is not None: tmp = json.loads(tmp.deck_content) result_decks[i + 1]["mydeck"] = tmp else: result_decks[i + 1]["mydeck"] = [] tmp = DuelDeck.objects.filter( room_number=room_number, mine_or_other=other_user, deck_id=i + 1 ).first() result_decks[i + 1]["deck_name"] = tmp.deck_name if tmp is not None: tmp = json.loads(tmp.deck_content) result_decks[i + 1]["otherdeck"] = tmp else: result_decks[i + 1]["otherdeck"] = [] i += 1 self.decks = result_decks def init_grave_info(self, user, other_user, room_number): self.grave_structure = Grave.objects.all() graves = self.grave_structure result_graves = [] result_graves.append(None) i = 0 for grave in graves: result_graves.append({}) result_graves[i + 1]["grave_name"] = grave.grave_name if grave.mine_or_other == 1: tmp = DuelGrave.objects.filter( room_number=room_number, mine_or_other=3, grave_id=i + 1 ).first() result_graves[i + 1]["deck_name"] = tmp.grave_name tmp = json.loads(tmp.grave_content) result_graves[i + 1]["commongrave"] = tmp else: tmp = DuelGrave.objects.filter( room_number=room_number, mine_or_other=user, grave_id=i + 1 ).first() result_graves[i + 1]["deck_name"] = tmp.grave_name tmp = json.loads(tmp.grave_content) result_graves[i + 1]["mygrave"] = tmp tmp = DuelGrave.objects.filter( room_number=room_number, mine_or_other=other_user, grave_id=i + 1 ).first() tmp = json.loads(tmp.grave_content) result_graves[i + 1]["othergrave"] = tmp i += 1 self.graves = result_graves def init_hand_info(self, user, other_user, room_number): self.hand_structure = Hand.objects.all() hands = self.hand_structure result_hands = [] result_hands.append(None) i = 0 for hand in hands: result_hands.append({}) result_hands[i + 1]["hand_name"] = hand.hand_name if hand.mine_or_other == 1: tmp = DuelHand.objects.filter( room_number=room_number, mine_or_other=3, hand_id=i + 1 ).first() result_hands[i + 1]["deck_name"] = tmp.hand_name tmp = json.loads(tmp.grave_content) tmp = json.loads(tmp.hand_content) result_hands[i + 1]["commonhand"] = tmp else: tmp = DuelHand.objects.filter( room_number=room_number, mine_or_other=user, hand_id=i + 1 ).first() result_hands[i + 1]["deck_name"] = tmp.hand_name tmp = json.loads(tmp.hand_content) result_hands[i + 1]["myhand"] = tmp tmp = DuelHand.objects.filter( room_number=room_number, mine_or_other=other_user, hand_id=i + 1 ).first() tmp = json.loads(tmp.hand_content) result_hands[i + 1]["otherhand"] = tmp i += 1 self.hands = result_hands def get_grave_with_effect( self, user_decks, effect_det, effect_kind, exclude, user, place, deck_id, x, y, mine_or_other, cost, ): return self.get_deck_with_effect( user_decks, effect_det, effect_kind, exclude, user, place, deck_id, x, y, mine_or_other, cost, ) def get_hand_with_effect( self, user_decks, effect_det, effect_kind, exclude, user, place, deck_id, x, y, mine_or_other, cost, ): return self.get_deck_with_effect( user_decks, effect_det, effect_kind, exclude, user, place, deck_id, x, y, mine_or_other, cost, ) def get_deck_with_effect( self, user_decks, effect_det, effect_kind, exclude, user, place, deck_id, x, y, mine_or_other, cost_flag, ): duel = self.duel return_deck = [] cost = self.cost mess = self.mess if duel.in_cost is True: if str(self.tmp_chain) in cost: cost = cost[str(self.tmp_chain)] else: cost = [] else: if str(duel.chain - 1) in cost: cost = cost[str(duel.chain - 1)] else: cost = [] if str(duel.chain - 1) in mess: mess = mess[str(duel.chain - 1)] else: mess = [] timing_mess = self.timing_mess for index in range(len(user_decks)): monster = user_decks[index] effect_flag = False if effect_kind != "": if self.check_no_choose( user_decks[index], user, effect_kind, place, deck_id, x, y, mine_or_other, cost_flag, ): effect_flag = True if exclude != "": excludes = exclude.split(",") for exclude_det in excludes: if exclude_det[0] == "~": if exclude_det in cost: for cost_det in cost[exclude_det]: if ( user_decks[index]["place_unique_id"] == cost_det["det"]["place_unique_id"] ): effect_flag = True continue if exclude_det[0] == "%": if exclude_det in timing_mess: for timing_det in timing_mess[exclude_det]: if ( user_decks[index]["place_unique_id"] == timing_det["det"]["place_unique_id"] ): effect_flag = True continue if exclude_det in mess: for mess_det in mess[exclude_det]: if ( user_decks[index]["place_unique_id"] == mess_det["det"]["place_unique_id"] ): effect_flag = True continue current_and_or = "and" monster_name_kind = effect_det["monster"]["monster_name_kind"] monster_names = self.check_change_name(user_decks[index], user, place, deck_id, x, y, -1) name_flag = True if ( "monster_effect" in effect_det["monster"] and effect_det["monster"]["monster_effect"] != 0 and effect_det["monster"]["monster_effect"] != "0" ): id = self.get_monster_id( user_decks[index], place, user_decks[index]["owner"], deck_id, 0, 0, mine_or_other, ) if str(effect_det["monster"]["monster_effect"]) != "": monster_effect_monster_ary = str(effect_det["monster"]["monster_effect"]).split("_") monster_effect_flag = False for monster_effect_monster in monster_effect_monster_ary: if monster_effect_monster[0] == "!": if id == int(monster_effect_monster[1:]): return False elif id == int(monster_effect_monster): monster_effect_flag = True break if monster_effect_flag is False: continue name_flag = True if len(monster_name_kind) != 1 or monster_name_kind[0]["operator"] != "": for name_kind in monster_name_kind: if name_kind != "": name_flag2 = False for monster_name in monster_names: if name_kind["operator"] == "=": if monster_name == self.get_name( name_kind["monster_name"], 0, user_decks[index] ): name_flag2 = True break elif name_kind["operator"] == "!=": if monster_name != self.get_name( name_kind["monster_name"], 0, user_decks[index] ): name_flag2 = True break elif name_kind["operator"] == "like": if ( monster_name.find( self.get_name( name_kind["monster_name"], 0, user_decks[index] ) ) == -1 ): name_flag2 = True break elif name_kind["operator"] == "notlike": if ( user_decks[index]["monster_name"].find( self.get_name( name_kind["monster_name"], 0, user_decks[index] ) ) != -1 ): name_flag2 = True break if current_and_or == "and": if name_flag is True: name_flag = name_flag2 else: if name_flag is False: name_flag = name_flag2 current_and_or = name_kind["and_or"] if name_flag is False: continue check_flag = effect_det["monster"]["flag"] if check_flag is not None and check_flag != "": if check_flag["operator"] == "=": if user_decks[index]["flag"] != int(check_flag["flag_det"]): continue elif check_flag["operator"] == "&": if user_decks[index]["flag"] & int(check_flag["flag_det"]) == 0: continue elif check_flag["operator"] == "^": if user_decks[index]["flag"] & int(check_flag["flag_det"]) != 0: continue monster_condition_val = effect_det["monster"]["monster_condition"] if monster_condition_val: for cond_det in monster_condition_val: cond_flag = True current_and_or = "and" tmp_flag = True for cond_val in cond_det: if not cond_val: continue name = self.check_swap_val( monster, mine_or_other, place, deck_id, x, y, cond_val["name"], mine_or_other, ) name2 = self.check_swap_init_val( monster, mine_or_other, place, deck_id, x, y, cond_val["name"], mine_or_other, ) tmp = user_decks[index]["variables"][cond_val["name"]] if not tmp["value"].isnumeric(): value = tmp["value"] else: if cond_val["init"] == 0: value = int(tmp["value"]) value = self.check_change_val( monster, mine_or_other, place, deck_id, x, y, name, mine_or_other, value ) elif cond_val["init"] == 1: tmp = user_decks[index]["variables"][name2] value = int(tmp["i_val"]) elif cond_val["init"] == 2: value = int(tmp["i_i_val"]) if cond_val["operator"] == "=" or cond_val["operator"] == "": if str(float(value)) != str(self.calculate_boland( cond_val["num"], None )): tmp_flag = False elif cond_val["operator"] == "<=": if str(value) > str(self.calculate_boland( cond_val["num"], None )): tmp_flag = False elif cond_val["operator"] == ">=": if str(value) < str(self.calculate_boland( cond_val["num"], None )): tmp_flag = False elif cond_val["operator"] == "!=": if str(value) == str(self.calculate_boland( cond_val["num"], None )): tmp_flag = False if current_and_or == "and": if cond_flag is True: cond_flag = tmp_flag else: if cond_flag is False: cond_flag = tmp_flag if cond_flag is False: continue if effect_flag is False: return_deck.append(index) return return_deck def count_deck(self,decks): i = 0 for deck in decks: if deck.show != 5: i += 1 return i def get_deck_info(self, decks, user, other_user, mode=0): dueldeck = self.decks return_value = [] i = 0 j= 0 for deck in decks: if deck.show == 5: i += 1 continue return_value.append({}) return_value[j]["deck_name"] = deck.deck_name return_value[j]["eternal"] = deck.eternal return_value[j]["invoke"] = deck.invoke return_value[j]["id"] = deck.id if deck.mine_or_other == 1: tmp = dueldeck[i + 1]["commondeck"] if mode == 1: if deck.show >= 1: return_value[j]["commondeck"] = tmp else: return_value[j]["commondeck"] = tmp return_value[j]["commondecknum"] = len(tmp) else: tmp = dueldeck[i + 1]["mydeck"] return_value[j]["mydecknum"] = len(tmp) if mode == 1: if deck.show >= 1: return_value[j]["mydeck"] = tmp else: return_value[j]["mydeck"] = tmp tmp = dueldeck[i + 1]["otherdeck"] return_value[j]["otherdecknum"] = len(tmp) if mode == 1: if deck.show >= 2: return_value[j]["otherdeck"] = tmp else: return_value[j]["otherdeck"] = tmp i += 1 j += 1 return return_value def get_grave_info(self, graves, user, other_user, mode=0): duelgrave = self.graves return_value = [] i = 0 for grave in graves: return_value.append({}) return_value[i]["grave_name"] = grave.grave_name return_value[i]["eternal"] = grave.eternal return_value[i]["invoke"] = grave.invoke return_value[i]["id"] = grave.id if grave.mine_or_other == 1: tmp = duelgrave[i + 1]["commongrave"] if mode == 1: if grave.show >= 1: return_value[i]["commongrave"] = tmp else: return_value[i]["commongrave"] = tmp return_value[i]["commongravenum"] = len(tmp) else: tmp = duelgrave[i + 1]["mygrave"] return_value[i]["mygravenum"] = len(tmp) if mode == 1: if grave.show >= 1: return_value[i]["mygrave"] = tmp else: return_value[i]["mygrave"] = tmp tmp = duelgrave[i + 1]["othergrave"] return_value[i]["othergravenum"] = len(tmp) if mode == 1: if grave.show >= 2: return_value[i]["othergrave"] = tmp else: return_value[i]["othergrave"] = tmp i += 1 return return_value def watch_hand(self, hands): return self.get_hand_info(hands, 0, 0, mode=2) def get_hand_info(self, hands, user, other_user, mode=0): duelhand = self.hands return_value = [] i = 0 for hand in hands: return_value.append({}) return_value[i]["hand_name"] = hand.hand_name return_value[i]["eternal"] = hand.eternal return_value[i]["invoke"] = hand.invoke return_value[i]["id"] = hand.id return_value[i]["show"] = hand.show if hand.mine_or_other == 1: tmp = duelhand[i + 1]["commonhand"] if mode == 1 or mode == 2 or mode == 3: if hand.show >= 1 and hand.show != 5: return_value[i]["commonhand"] = tmp else: return_value[i]["commonhand"] = tmp return_value[i]["commonhandnum"] = len(tmp) else: tmp = duelhand[i + 1]["myhand"] return_value[i]["myhandnum"] = len(tmp) if mode == 1 or mode == 3: if hand.show >= 1 and hand.show != 5: return_value[i]["myhand"] = tmp elif mode == 2: if hand.show == 2 or hand.show != 5: return_value[i]["myhand"] = tmp else: return_value[i]["myhand"] = tmp tmp = duelhand[i + 1]["otherhand"] return_value[i]["otherhandnum"] = len(tmp) if mode == 1 or mode == 2: if hand.show == 2 and hand.show != 5: return_value[i]["otherhand"] = tmp else: if (hand.show == 3 or hand.show == 4) and mode != 3: return_value[i]["otherhand"] = [] for val in tmp: show = self.check_change_val(val, user, "hand", i+1, 0, 0, "show", 2,int(val["variables"]["show"]["value"]) ) if(show == 1): return_value[i]["otherhand"].append(val) else: tmp_monster = {} tmp_monster["id"] = 0 tmp_relate = {} tmp_relate["monster"] = tmp_monster tmp_relate["det"] = tmp_monster tmp_relate["place_unique_id"] = -1 tmp_relate["card_unique_id"] = -1 tmp_relate["mine_or_other"] = other_user tmp_relate["user"] = other_user tmp_relate["place"] = "hand" tmp_relate["deck_id"] = i +1 tmp_relate["x"] = 0 tmp_relate["y"] = 0 return_value[i]["otherhand"].append(tmp_relate) else: return_value[i]["otherhand"] = tmp i += 1 return return_value def invoke_eternal_effect_det(self, eternal, effect_user): duel = self.duel eternal_effect = eternal["eternal"] turn = eternal_effect.turn if(eternal_effect.eternal_effect_val == 8 or eternal_effect.eternal_effect_val == 9): name_flag = True else: name_flag = False if turn != 0: if effect_user == 1: if ( duel.user_turn == 1 and turn == 1 or duel.user_turn == 2 and turn == 2 ): pass else: return elif effect_user == 2: if ( duel.user_turn == 2 and turn == 1 or duel.user_turn == 1 and turn == 2 ): pass else: return if duel.timing is not None: if duel.timing not in eternal_effect.timing.all(): return False elif eternal_effect.none_timing is False: return False if duel.timing2 is not None: if duel.timing2 not in eternal_effect.timing2.all(): return False elif eternal_effect.none_timing2 is False: return False if duel.timing3 is not None: if duel.timing3 not in eternal_effect.timing3.all(): return False elif eternal_effect.none_timing3 is False: return False if eternal_effect.eternal_effect_condition != "": eternal_condition = json.loads(eternal_effect.eternal_effect_condition) if ( self.check_monster_condition( eternal_condition["monster"], effect_user, False, None, [], 0, eternal_effect.eternal_kind, name_flag = name_flag ) is False ): return if (eternal_effect.invalid_monster) != "": invalid_monsters = json.loads(eternal_effect.invalid_monster) else: invalid_monsters = "" val = eternal_effect.eternal_effect_val val2 = eternal_effect.eternal_effect_val2 ignore = eternal_effect.ignore val_name = eternal_effect.val_name change_val = eternal_effect.value global_id = eternal_effect.eternal_global_variable effect_kinds = eternal_effect.eternal_kind invalid_kinds = eternal_effect.invalid_eternal_kind tmp_val = eternal_effect.eternal_tmp_val cost_or_effect = eternal_effect.cost_or_effect mine_or_other_effect = eternal_effect.mine_or_other_effect if eternal_effect.eternal_monster != "": eternal_monsters = json.loads(eternal_effect.eternal_monster) eternal_monster = eternal_monsters["monster"][0] eternal_monster_place_ary = eternal_monsters["monster"][0]["monster"]["place"] else: if "place_unique_id" in eternal: place_unique_id = eternal["place_unique_id"] else: place_unique_id = None if val == 0: if val2 == 0 or val2 == 2 or val2 == 4: self.no_eternal_effect( eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ) if val2 == 1 or val2 == 2 or val2 == 4: self.invoke_invalid_effect( eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ) if val2 == 3: self.not_effected_effect( eternal, invalid_kinds, place_unique_id, global_id, tmp_val, cost_or_effect, mine_or_other_effect, ) if val == 1: self.change_variable_effect( eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 2 or (val == 0 and val2 == 4): self.no_invoke_effect( eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ) if val == 3: self.no_choose_effect( eternal, invalid_kinds, place_unique_id, global_id, tmp_val, cost_or_effect, mine_or_other_effect, ) if val == 4: self.change_destination_effect( eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 5: self.swap_variable_effect( eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) elif val == 8: self.swap_init_variable_effect( eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 6: if ignore == 1: self.check_chain( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 2: self.check_chain_user( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 3: self.check_chain_kind( eternal, invalid_kinds, place_unique_id, global_id, eternal_effect.ignore_effect_kind, mine_or_other_effect, ) elif ignore == 4: self.check_same_chain( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 5: self.check_same_monster_chain( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 6: self.check_same_monster_exist_chain( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 7: self.check_eternal_phase( eternal, invalid_kinds, place_unique_id, global_id, eternal_effect.ignore_phase.all(), mine_or_other_effect, ) elif ignore == 8: self.check_eternal_mine_or_other( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 9: self.check_eternal_no_invoke( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 10: self.check_eternal_timing( eternal, invalid_kinds, place_unique_id, global_id, eternal_effect.ignore_timing.all(), mine_or_other_effect, ) elif ignore == 11: self.check_eternal_monster_place( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 12: self.check_eternal_monster_place_condition( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 13: self.check_eternal_turn( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 14: self.check_eternal_monster_condition( eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ) elif ignore == 15: self.check_eternal_monster_variable( eternal, invalid_kinds, place_unique_id, global_id, eternal_effect.ignore_variable, mine_or_other_effect, ) elif val == 7: self.take_variable_instead_func( eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ) return if invalid_monsters != "": invalid_monster = invalid_monsters["monster"][0]["monster"] else: invalid_monster = "" persist = eternal_effect.persist eternal["persist"] = persist eternal["invalid_kinds"] = invalid_kinds for eternal_monster_place in eternal_monster_place_ary: eternal_places = eternal_monster_place["det"].split("_") if (effect_user == 1 and int(eternal_places[2]) == 1) or ( effect_user == 2 and int(eternal_places[2]) == 2 ): mine_or_other4 = 1 elif ( effect_user == 2 and int(eternal_places[2]) == 1 or (effect_user == 2 and int(eternal_places[2]) == 1) ): mine_or_other4 = 2 else: mine_or_other4 = 3 eternal["mine_or_other"] = mine_or_other4 if eternal["place"] == "" or eternal["place"] is None: flag = True det = {} det["place_unique_id"] = "" elif eternal["place"] != eternal_places[0]: continue elif eternal["place"] == "field": fields = self.field x = int(eternal["x"]) y = int(eternal["y"]) mine_or_other = int(fields[x][y]["mine_or_other"]) kind = fields[x][y]["kind"] tmp = kind.split("_") if mine_or_other != mine_or_other4 or eternal_places[1] not in tmp: continue else: det = fields[x][y]["det"] if det is None: continue tmp2 = {} tmp2["det"] = fields[x][y]["det"] tmp2["mine_or_other"] = fields[x][y]["mine_or_other"] tmp2["user"] = effect_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = fields[x][y]["det"]["place_unique_id"] if not self.check_monster_condition_det( eternal_monster, fields[x][y]["det"], effect_user ): continue eternal["place_unique_id"] = det["place_unique_id"] eternal["relate_monster"] = [] eternal["mine_or_other"] = fields[x][y]["mine_or_other"] if ( invalid_monster != "" and len(invalid_monster["relation"]) != 0 and "rel" in det ): for index in range(len(invalid_monster["relation"])): relation_kind = invalid_monster["relation_kind"][index] relation_to = int(invalid_monster["relation_to"][index]) relation = invalid_monster["relation"][index] if relation_kind in det["rel"]: for relation_det in det["rel"][relation_kind]: if ( relation_det["name"] == relation and int(relation_det["to"]) == relation_to ): eternal["relate_monster"].append(relation_det) if not self.check_eternal_invalid( det, effect_user, effect_kinds, "field", 0, x, y, fields[x][y]["mine_or_other"], ): fields[x][y]["det"]["already"] = 1 flag = True self.field = fields else: fields[x][y]["det"]["already"] = 0 flag = False self.field = fields elif eternal["place"] == "deck": deck_id = int(eternal["deck_id"]) mine_or_other = eternal["mine_or_other"] if (self.user == 1 and mine_or_other == 1) or ( self.user == 2 and mine_or_other == 2 ): mine_or_other2 = 1 elif (self.user == 2 and mine_or_other == 1) or ( self.user == 1 and mine_or_other == 2 ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other4 != mine_or_other or deck_id != int(eternal_places[1]): continue else: if mine_or_other2 == 1: decks = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: decks = self.decks[deck_id]["otherdeck"] elif mine_or_other2 == 3: decks = self.decks[deck_id]["commondeck"] if "index" in eternal: i = eternal["index"] else: i = -1 for deck_i in range(len(decks)): if ( decks[deck_i]["place_unique_id"] == eternal["place_unique_id"] ): if not self.check_monster_condition_det( eternal_monster, decks[deck_i], effect_user ): break i = deck_i break if i == -1: continue det = decks[i] tmp2 = {} tmp2["det"] = decks[i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = effect_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = decks[i]["place_unique_id"] eternal["place_unique_id"] = decks[i]["place_unique_id"] if ( invalid_monster != "" and len(invalid_monster["relation"]) != 0 and "rel" in det ): for index in range(len(invalid_monster["relation"])): relation_kind = invalid_monster["relation_kind"][index] relation_to = invalid_monster["relation_to"][index] relation = invalid_monster["relation"][index] if relation_kind in det["rel"]: for relation_det in det["rel"][relation_kind]: if ( relation_det["name"] == relation and relation_det["to"] == relation_to ): eternal["relate_monster"].append( det["rel"][relation_kind] ) if not self.check_eternal_invalid( decks[i], effect_user, effect_kinds, "deck", deck_id, 0, 0, mine_or_other2, ): decks[i]["already"] = 1 flag = True else: flag = False decks[i]["already"] = 0 if mine_or_other2 == 1: self.decks[deck_id]["mydeck"] = decks elif mine_or_other2 == 2: self.decks[deck_id]["otherdeck"] = decks elif mine_or_other2 == 3: self.decks[deck_id]["commondeck"] = decks elif eternal["place"] == "grave": deck_id = int(eternal["deck_id"]) mine_or_other = eternal["mine_or_other"] if (self.user == 1 and mine_or_other == 1) or ( self.user == 2 and mine_or_other == 2 ): mine_or_other2 = 1 elif (self.user == 2 and mine_or_other == 1) or ( self.user == 1 and mine_or_other == 2 ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other4 != mine_or_other or deck_id != int(eternal_places[1]): continue else: if mine_or_other2 == 1: graves = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: graves = self.graves[deck_id]["othergrave"] elif mine_or_other2 == 3: graves = self.graves[deck_id]["commongrave"] if "index" in eternal: i = eternal["index"] else: i = -1 for grave_i in range(len(graves)): if ( graves[grave_i]["place_unique_id"] == eternal["place_unique_id"] ): if not self.check_monster_condition_det( eternal_monster, graves[grave_i], effect_user ): break i = grave_i break if i == -1: continue det = graves[i] tmp2 = {} tmp2["det"] = det tmp2["mine_or_other"] = mine_or_other tmp2["user"] = effect_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = det["place_unique_id"] eternal["place_unique_id"] = det["place_unique_id"] if ( invalid_monster != "" and len(invalid_monster["relation"]) != 0 and "rel" in det ): for index in range(len(invalid_monster["relation"])): relation_kind = invalid_monster["relation_kind"][index] relation_to = invalid_monster["relation_to"][index] relation = invalid_monster["relation"][index] if relation_kind in det["rel"]: for relation_det in det["rel"][relation_kind]: if ( relation_det["name"] == relation and relation_det["to"] == relation_to ): eternal["relate_monster"].append( det["rel"][relation_kind] ) if not self.check_eternal_invalid( graves[i], effect_user, effect_kinds, "grave", deck_id, 0, 0, mine_or_other2, ): graves[i]["already"] = 1 flag = True else: flag = False graves[i]["already"] = 0 if mine_or_other2 == 1: self.graves[deck_id]["mygrave"] = graves elif mine_or_other2 == 2: self.graves[deck_id]["othergrave"] = graves elif mine_or_other2 == 3: self.graves[deck_id]["commongrave"] = graves elif eternal["place"] == "hand": deck_id = int(eternal["deck_id"]) mine_or_other = eternal["mine_or_other"] if (self.user == 1 and mine_or_other == 1) or ( self.user == 2 and mine_or_other == 2 ): mine_or_other2 = 1 elif (self.user == 2 and mine_or_other == 1) or ( self.user == 1 and mine_or_other == 2 ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other4 != mine_or_other or deck_id != int(eternal_places[1]): continue else: if mine_or_other2 == 1: hands = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: hands = self.hands[deck_id]["otherhand"] elif mine_or_other2 == 3: hands = self.hands[deck_id]["commonhand"] if "index" in eternal: i = eternal["index"] else: i = -1 for hand_i in range(len(hands)): if ( hands[hand_i]["place_unique_id"] == eternal["place_unique_id"] ): if not self.check_monster_condition_det( eternal_monster, hands[hand_i], effect_user ): break i = hand_i break if i != -1: det = hands[i] tmp2 = {} tmp2["det"] = det tmp2["mine_or_other"] = mine_or_other tmp2["user"] = effect_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = det["place_unique_id"] eternal["place_unique_id"] = det["place_unique_id"] else: continue if ( invalid_monster != "" and len(invalid_monster["relation"]) != 0 and "rel" in det ): eternal["relate_monster"] = [] for index in range(len(invalid_monster["relation"])): relation_kind = invalid_monster["relation_kind"][index] relation_to = invalid_monster["relation_to"][index] relation = invalid_monster["relation"][index] if relation_kind in det["rel"]: for relation_det in det["rel"][relation_kind]: if ( relation_det["name"] == relation and relation_det["to"] == relation_to ): eternal["relate_monster"].append( det["rel"][relation_kind] ) if not self.check_eternal_invalid( hands[i], effect_user, effect_kinds, "hand", deck_id, 0, 0, mine_or_other2, ): hands[i]["already"] = 1 flag = True else: flag = False hands[i]["already"] = 0 if mine_or_other2 == 1: self.hands[deck_id]["myhand"] = hands elif mine_or_other2 == 2: self.hands[deck_id]["otherhand"] = hands elif mine_or_other2 == 3: self.hands[deck_id]["commonhand"] = hands if tmp_val != "" and val != 8 and val != 9: tmp_val = self.calculate_boland(tmp_val, tmp2) if flag is True: if val == 0: if val2 == 0 or val2 == 2 or val2 == 4: self.no_eternal_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, mine_or_other_effect, ) if val2 == 1 or val2 == 2 or val2 == 4: self.invoke_invalid_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, mine_or_other_effect, ) if val2 == 3: self.not_effected_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, cost_or_effect, mine_or_other_effect, ) if val == 1: self.change_variable_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 2 or (val == 0 and val2 == 4): self.no_invoke_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, mine_or_other_effect, ) if val == 3: self.no_choose_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, cost_or_effect, mine_or_other_effect, ) if val == 4: self.change_destination_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 5: self.swap_variable_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 8: self.swap_init_variable_effect( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 6: if ignore == 1: self.check_chain( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 2: self.check_chain_user( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 3: self.check_chain_kind( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_effect_kind, mine_or_other_effect, ) elif ignore == 4: self.check_same_chain( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 5: self.check_same_monster_chain( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 6: self.check_same_monster_exist_chain( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 7: self.check_eternal_phase( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_phase.all(), mine_or_other_effect, ) elif ignore == 8: self.check_eternal_mine_or_other( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 9: self.check_eternal_no_invoke( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 10: self.check_eternal_timing( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_timing.all(), mine_or_other_effect, ) elif ignore == 11: self.check_eternal_monster_place( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 12: self.check_eternal_monster_place_condition( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 13: self.check_eternal_turn( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 14: self.check_eternal_monster_condition( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 15: self.check_eternal_monster_variable( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_variable, mine_or_other_effect, ) elif val == 7: self.take_variable_instead_func( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ) elif val == 8: self.change_name_func( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ) elif val == 9: self.change_name_add_func( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ) else: if val == 0: if val2 == 0 or val2 == 2 or val2 == 4: self.no_eternal_effect_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, mine_or_other_effect, ) if val2 == 1 or val2 == 2 or val2 == 4: self.invoke_invalid_effect_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, mine_or_other_effect, ) if val2 == 3: self.not_effected_effect_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, cost_or_effect, mine_or_other_effect, ) if val == 1: self.change_variable_effect_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 2 or (val == 0 and val2 == 4): self.no_invoke_effect_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, mine_or_other_effect, ) if val == 3: self.no_choose_effect_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, tmp_val, cost_or_effect, mine_or_other_effect, ) if val == 4: self.change_destination_effect_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 5: self.swap_variable_effect_remove( eternal, invalid_kinds, None, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) elif val == 8: self.swap_init_variable_effect_remove( eternal, invalid_kinds, None, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ) if val == 6: if ignore == 1: self.check_chain_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, mine_or_other_effect, ) elif ignore == 2: self.check_chain_user_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 3: self.check_chain_kind_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_effect_kind, mine_or_other_effect, ) elif ignore == 4: self.check_same_chain_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 5: self.check_same_monster_chain_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 6: self.check_same_monster_exist_chain_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 7: self.check_eternal_phase_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_phase.all(), mine_or_other_effect, ) elif ignore == 8: self.check_eternal_mine_or_other_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 9: self.check_eternal_no_invoke_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 10: self.check_eternal_timing_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_timing.all(), mine_or_other_effect, ) elif ignore == 11: self.check_eternal_monster_place_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 12: self.check_eternal_monster_place_condition_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 13: self.check_eternal_turn_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 14: self.check_eternal_monster_condition_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, mine_or_other_effect, ) elif ignore == 15: self.check_eternal_monster_variable_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, eternal_effect.ignore_variable, mine_or_other_effect, ) if val == 7: self.take_variable_instead_func_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ) elif val == 8: self.change_name_func_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ) elif val == 9: self.change_name_add_func_remove( eternal, invalid_kinds, det["place_unique_id"], global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ) return def no_choose_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, cost_or_effect, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["cost_or_effect"] = cost_or_effect eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.no_choose_eternal_effect: self.no_choose_eternal_effect.remove(eternal) def no_choose_effect( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, cost_or_effect, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["cost_or_effect"] = cost_or_effect eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.no_choose_eternal_effect: self.no_choose_eternal_effect.append(eternal) def change_variable_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["val"] = change_val eternal["tmp_val"] = tmp_val if eternal in self.change_val_eternal_effect: self.change_val_eternal_effect.remove(eternal) def check_eternal_monster_variable( self, eternal, invalid_kinds, place_unique_id, global_id, ignore_variable, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["ignore_variable"] = ignore_variable eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_monster_variable: self.check_monster_variable.append(eternal) def check_eternal_monster_variable_remove( self, eternal, invalid_kinds, place_unique_id, global_id, ignore_variable, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["ignore_variable"] = ignore_variable eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_monster_variable: self.check_monster_variable.remove(eternal) def check_eternal_monster_condition( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_monster_condition_list: self.check_monster_condition_list.append(eternal) def check_eternal_monster_condition_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_monster_condition_list: self.check_monster_condition_list.remove(eternal) def check_eternal_turn( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_turn: self.check_turn.append(eternal) def check_eternal_turn_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_turn: self.check_turn.remove(eternal) def check_eternal_monster_place_condition( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_monster_place_condition: self.check_monster_place_condition.append(eternal) def check_eternal_monster_place( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_monster_place_condition: self.check_monster_place_condition.append(eternal) def check_eternal_monster_place_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_monster_place_condition: self.check_monster_place_condition.remove(eternal) def check_eternal_timing( self, eternal, invalid_kinds, place_unique_id, global_id, timings, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["timings"] = timings eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_timing: self.check_ignore_timing.append(eternal) def check_eternal_timing_remove( self, eternal, invalid_kinds, place_unique_id, global_id, timings, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["timings"] = timings eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_timing: self.check_ignore_timing.remove(eternal) def check_eternal_no_invoke( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_no_invoke: self.check_ignore_no_invoke.append(eternal) def check_eternal_no_invoke_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_no_invoke: self.check_ignore_no_invoke.remove(eternal) def check_eternal_mine_or_other( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_mine_or_other: self.check_ignore_mine_or_other.append(eternal) def check_eternal_mine_or_other_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_mine_or_other: self.check_ignore_mine_or_other.remove(eternal) def check_eternal_phase( self, eternal, invalid_kinds, place_unique_id, global_id, phases, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["phases"] = phases eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_phase: self.check_ignore_phase.append(eternal) def check_eternal_phase_remove( self, eternal, invalid_kinds, place_unique_id, global_id, phases, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["phases"] = phases eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_phase: self.check_ignore_phase.remove(eternal) def check_same_monster_exist_chain( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_same_monster_exist_chain: self.check_ignore_chain_same_monster_exist_chain.append(eternal) def check_same_monster_exist_chain_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_same_monster_exist_chain: self.check_ignore_same_monster_exist_chain.remove(eternal) def check_same_monster_chain( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_same_monster_chain: self.check_ignore_chain_same_monster_chain.append(eternal) def check_same_monster_chain_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_same_monster_chain: self.check_ignore_same_monster_chain.remove(eternal) def check_same_chain( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_same_chain: self.check_ignore_chain_same_chain.append(eternal) def check_same_chain_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_same_chain: self.check_ignore_same_chain.remove(eternal) def check_chain_kind( self, eternal, invalid_kinds, place_unique_id, global_id, ignore_kind, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["ignore_kind"] = ignore_kind eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_chain_kind: self.check_ignore_chain_user_kind.append(eternal) def check_chain_kind_remove( self, eternal, invalid_kinds, place_unique_id, global_id, ignore_kind, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["ignore_kind"] = ignore_kind eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_chain_kind: self.check_ignore_chain_kind.remove(eternal) def check_chain_user( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_chain_user_only: self.check_ignore_chain_user_only.append(eternal) def check_chain_user_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_chain_user_only: self.check_ignore_chain_user_only.remove(eternal) def check_chain( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.check_ignore_chain: self.check_ignore_chain.append(eternal) def check_chain_remove( self, eternal, invalid_kinds, place_unique_id, global_id, mine_or_other_effect ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.check_ignore_chain: self.check_ignore_chain.remove(eternal) def swap_init_variable_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["val"] = change_val eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.swap_init_val_eternal_effect: self.swap_init_val_eternal_effect.remove(eternal) def swap_variable_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["val"] = change_val eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.swap_val_eternal_effect: self.swap_val_eternal_effect.remove(eternal) def take_variable_instead_func_remove( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["tmp_val"] = tmp_val eternal["val"] = change_val eternal["cost_or_effect"] = cost_or_effect eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.take_variable_instead: self.take_variable_instead.remove(eternal) def change_name_add_func_remove( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["cost_or_effect"] = cost_or_effect eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.change_name_add_eternal_effect: self.change_name_add_eternal_effect.remove(eternal) def change_name_add_func( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["cost_or_effect"] = cost_or_effect eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.change_name_add_eternal_effect: self.change_name_add_eternal_effect.append(eternal) def change_name_func( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["cost_or_effect"] = cost_or_effect eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.change_name_eternal_effect: self.change_name_eternal_effect.append(eternal) def change_name_func_remove( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["cost_or_effect"] = cost_or_effect eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.change_name_eternal_effect: self.change_name_eternal_effect.remove(eternal) def take_variable_instead_func( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, cost_or_effect, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["cost_or_effect"] = cost_or_effect eternal["val"] = change_val eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.take_variable_instead: self.take_variable_instead.append(eternal) def change_destination_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["tmp_val"] = tmp_val eternal["val"] = change_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.change_destination_eternal_effect: self.change_destination_eternal_effect.remove(eternal) def change_destination_effect( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["val"] = change_val eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.change_destination_eternal_effect: self.change_destination_eternal_effect.append(eternal) def change_variable_effect( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["val"] = change_val eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.change_val_eternal_effect: self.change_val_eternal_effect.append(eternal) def swap_variable_effect( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["val"] = change_val eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.swap_val_eternal_effect: self.swap_val_eternal_effect.append(eternal) def swap_init_variable_effect( self, eternal, invalid_kinds, place_unique_id, global_id, val_name, change_val, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["val_name"] = val_name eternal["val"] = change_val eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.swap_init_val_eternal_effect: self.swap_init_val_eternal_effect.append(eternal) def no_eternal_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.not_eternal_effect: self.not_eternal_effect.remove(eternal) def no_eternal_effect( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.not_eternal_effect: self.not_eternal_effect.append(eternal) def not_effected_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, cost_or_effect, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["cost_or_effect"] = cost_or_effect eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.not_effected_eternal_effect: self.not_effected_eternal_effect.remove(eternal) def not_effected_effect( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, cost_or_effect, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["cost_or_effect"] = cost_or_effect eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.not_effected_eternal_effect: self.not_effected_eternal_effect.append(eternal) def invoke_invalid_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.invoke_invalid_eternal_effect: self.invoke_invalid_eternal_effect.remove(eternal) def invoke_invalid_effect( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.invoke_invalid_eternal_effect: self.invoke_invalid_eternal_effect.append(eternal) def no_invoke_effect_remove( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal in self.no_invoke_eternal_effect: self.no_invoke_eternal_effect.remove(eternal) def no_invoke_effect( self, eternal, invalid_kinds, place_unique_id, global_id, tmp_val, mine_or_other_effect, ): eternal["invalid_kinds"] = invalid_kinds eternal["place_unique_id"] = place_unique_id eternal["global_name"] = global_id eternal["tmp_val"] = tmp_val eternal["mine_or_other_effect"] = mine_or_other_effect if eternal not in self.no_invoke_eternal_effect: self.no_invoke_eternal_effect.append(eternal) def invoke_eternal_effect(self, eternal_effects, user, other_user): duel = self.duel decks = self.deck_structure graves = self.grave_structure hands = self.hand_structure fields = self.field eternals = [] for eternal in eternal_effects: if eternal.eternal_global_variable: tmp = eternal.eternal_global_variable.split("_") mine_or_other = int(tmp[1]) variable = json.loads(duel.global_variable) tmp_val = int(eternal.eternal_global_variable_val) user_flag = True other_user_flag = True if mine_or_other == 3: other_user_flag = False if not variable[tmp[0]]["value"] == tmp_val: user_flag = False else: if user == 1: if mine_or_other == 1: if not variable[tmp[0]]["1_value"] == tmp_val: user_flag = False if not variable[tmp[0]]["2_value"] == tmp_val: other_user_flag = False elif mine_or_other == 2: if not variable[tmp[0]]["2_value"] == tmp_val: user_flag = False if not variable[tmp[0]]["1_value"] == tmp_val: other_user_flag = False else: if mine_or_other == 1: if not variable[tmp[0]]["2_value"] == tmp_val: user_flag = False if not variable[tmp[0]]["1_value"] == tmp_val: other_user_flag = False elif mine_or_other == 2: if not variable[tmp[0]]["1_value"] == tmp_val: user_flag = False if not variable[tmp[0]]["2_value"] == tmp_val: other_user_flag = False if user_flag is True: tmp = {} tmp["eternal"] = copy.deepcopy(eternal) tmp["place"] = "" tmp["effect_val"] = eternal.eternal_effect_val tmp["kind"] = eternal.eternal_kind tmp["priority"] = eternal.priority tmp["already"] = 0 tmp["user"] = user tmp["mine_or_other"] = user eternals.append(tmp) if other_user_flag is True: tmp = {} tmp["eternal"] = copy.deepcopy(eternal) tmp["place"] = "" tmp["effect_val"] = eternal.eternal_effect_val tmp["kind"] = eternal.eternal_kind tmp["priority"] = eternal.priority tmp["already"] = 0 tmp["user"] = other_user tmp["mine_or_other"] = other_user eternals.append(tmp) variable_eternal = EternalEffect.objects.filter(~Q(eternal_variable="")) deck_info = self.get_deck_info(decks, user, other_user, 0) grave_info = self.get_grave_info(graves, user, other_user, 0) hand_info = self.get_hand_info(hands, user, other_user, 0) eternals += self.check_field_eternal(fields, user, other_user, variable_eternal) eternals += self.check_deck_eternal( deck_info, self.count_deck(decks), user, other_user, variable_eternal ) eternals += self.check_grave_eternal( grave_info, graves.count(), user, other_user, variable_eternal ) eternals += self.check_hand_eternal( hand_info, hands.count(), user, other_user, variable_eternal ) eternals = sorted(eternals, key=lambda x: x["already"], reverse=True) eternals = sorted(eternals, key=lambda x: x["priority"], reverse=True) while True: check_ignore_chain = copy.deepcopy(self.check_ignore_chain) check_ignore_chain_user_only = copy.deepcopy(self.check_ignore_chain_user_only) check_ignore_chain_kind = copy.deepcopy(self.check_ignore_chain_kind) check_ignore_same_chain = copy.deepcopy(self.check_ignore_same_chain) check_ignore_same_monster_chain = copy.deepcopy(self.check_ignore_same_monster_chain) check_ignore_same_monster_exist_chain = ( copy.deepcopy(self.check_ignore_same_monster_exist_chain) ) check_ignore_phase = copy.deepcopy(self.check_ignore_phase) for tmp_for in check_ignore_phase: del tmp_for["phases"] check_ignore_mine_or_other = copy.deepcopy(self.check_ignore_mine_or_other) check_ignore_no_invoke = copy.deepcopy(self.check_ignore_no_invoke) check_ignore_timing = copy.deepcopy(self.check_ignore_timing) for tmp_for in check_ignore_timing: del tmp_for["timings"] check_monster_place_condition = copy.deepcopy(self.check_monster_place_condition) check_turn = copy.deepcopy(self.check_turn) check_monster_condition_list = copy.deepcopy(self.check_monster_condition_list) check_monster_variable = copy.deepcopy(self.check_monster_variable) change_name_eternal_effect = copy.deepcopy(self.change_name_eternal_effect) change_name_add_eternal_effect = copy.deepcopy(self.change_name_add_eternal_effect) no_choose_eternal_effect = copy.deepcopy(self.no_choose_eternal_effect) change_val_eternal_effect = copy.deepcopy(self.change_val_eternal_effect) swap_val_eternal_effect = copy.deepcopy(self.swap_val_eternal_effect) swap_init_val_eternal_effect = copy.deepcopy(self.swap_init_val_eternal_effect) change_destination_eternal_effect = copy.deepcopy(self.change_destination_eternal_effect) invoke_invalid_eternal_effect = copy.deepcopy(self.invoke_invalid_eternal_effect) no_invoke_eternal_effect = copy.deepcopy(self.no_invoke_eternal_effect) not_effected_eternal_effect = copy.deepcopy(self.not_effected_eternal_effect) not_eternal_effect = copy.deepcopy(self.not_eternal_effect) take_variable_instead = copy.deepcopy(self.take_variable_instead) for eternal in eternals: if eternal["user"] == user: self.invoke_eternal_effect_det(eternal, user) elif eternal["user"] == other_user: self.invoke_eternal_effect_det(eternal, other_user) self_check_ignore_phase_compare = copy.deepcopy(self.check_ignore_phase) for val_for in self_check_ignore_phase_compare: del val_for["phases"] self_check_ignore_timing_compare = copy.deepcopy(self.check_ignore_timing) for val_for in self_check_ignore_timing_compare: del val_for["timings"] if ( self.no_choose_eternal_effect == no_choose_eternal_effect and self.swap_val_eternal_effect == swap_val_eternal_effect and self.swap_init_val_eternal_effect == swap_init_val_eternal_effect and self.change_val_eternal_effect == change_val_eternal_effect and self.change_name_eternal_effect == change_name_eternal_effect and self.change_name_add_eternal_effect == change_name_add_eternal_effect and self.invoke_invalid_eternal_effect == invoke_invalid_eternal_effect and self.not_effected_eternal_effect == not_effected_eternal_effect and self.not_eternal_effect == not_eternal_effect and self.no_invoke_eternal_effect == no_invoke_eternal_effect and change_destination_eternal_effect == self.change_destination_eternal_effect and check_ignore_chain == self.check_ignore_chain and check_ignore_chain_user_only == self.check_ignore_chain_user_only and check_ignore_chain_kind == self.check_ignore_chain_kind and check_ignore_same_chain == self.check_ignore_same_chain and check_ignore_same_monster_chain == self.check_ignore_same_monster_chain and check_ignore_same_monster_exist_chain == self.check_ignore_same_monster_exist_chain and check_ignore_phase == self_check_ignore_phase_compare and check_ignore_mine_or_other == self.check_ignore_mine_or_other and check_ignore_no_invoke == self.check_ignore_no_invoke and check_ignore_timing == self_check_ignore_timing_compare and check_monster_place_condition == self.check_monster_place_condition and check_turn == self.check_turn and check_monster_condition_list == self.check_monster_condition_list and check_monster_variable == self.check_monster_variable and take_variable_instead == self.take_variable_instead ): break def clear_eternal_effect(self, decks, graves, hands): self.no_choose_eternal_effect = [] self.change_val_eternal_effect = [] self.change_name_eternal_effect = [] self.change_name_add_eternal_effect = [] self.swap_val_eternal_effect = [] self.swap_init_val_eternal_effect = [] self.change_destination_eternal_effect = [] self.take_variable_instead = [] self.invoke_invalid_eternal_effect = [] self.no_invoke_eternal_effect = [] self.not_effected_eternal_effect = [] self.not_eternal_effect = [] self.check_ignore_chain = [] self.check_ignore_chain_user_only = [] self.check_ignore_chain_kind = [] self.check_ignore_same_chain = [] self.check_ignore_same_monster_chain = [] self.check_ignore_same_monster_exist_chain = [] self.check_ignore_phase = [] self.check_ignore_mine_or_other = [] self.check_ignore_no_invoke = [] self.check_ignore_timing = [] self.check_monster_place_condition = [] self.check_turn = [] self.check_monster_condition_list = [] self.check_monster_variable = [] def invoke_after_chain_effect(self, decks, graves, hands, phase, turn, user, other_user): none_chain_effect = EndChainEffect.objects.first() if none_chain_effect is not None: self.invoke_no_chain_effect(none_chain_effect, user, other_user, none_chain_effect.monster_effect_kind) self.expire_chain() def check_eternal_effect(self, decks, graves, hands, phase, turn, user, other_user): self.clear_eternal_effect(decks, graves, hands) self.init_virtual_variable(user, other_user, self.room_number) duel = self.duel eternal_effects = EternalEffect.objects.filter( Q(phase=phase) | Q(phase__isnull=True) ) eternal_effects = eternal_effects.filter( Q(chain__isnull=True) | Q(chain=duel.virtual_chain, chain_kind=2) | Q(chain__lte=duel.virtual_chain, chain_kind=0) | Q(chain__gte=duel.virtual_chain, chain_kind=1) ) eternal_effects = eternal_effects.filter(none_monster=True) if duel.timing is not None: eternal_effects = eternal_effects.filter(Q(timing=duel.timing)) else: eternal_effects = eternal_effects.filter(Q(none_timing=True)) if duel.timing2 is not None: eternal_effects = eternal_effects.filter(Q(timing2=duel.timing2)) else: eternal_effects = eternal_effects.filter(Q(none_timing2=True)) if duel.timing3 is not None: eternal_effects = eternal_effects.filter(Q(timing3=duel.timing3)) else: eternal_effects = eternal_effects.filter(Q(none_timing3=True)) eternal_effects = eternal_effects.order_by("eternal_effect_val") eternal_effects = eternal_effects.order_by("-priority") self.invoke_eternal_effect(eternal_effects, user, other_user) none_chain_effects = EternalTrigger.objects.all() if duel.is_ai is False: none_chain_effects = none_chain_effects.filter( Q(enemy = 0 ) | Q(enemy = 1) ) none_chain_effects = none_chain_effects.filter( Q(enemy_own = 0 ) | Q(enemy_own = 1) ) else: none_chain_effects = none_chain_effects.filter( Q(enemy = 2 ) | Q(enemy = 1) ) if user == 1: none_chain_effects = none_chain_effects.filter( Q(enemy_own = 0 ) | Q(enemy_own = 1) ) else: none_chain_effects = none_chain_effects.filter( Q(enemy_own = 1 ) | Q(enemy_own = 2) ) none_chain_effects = none_chain_effects.filter( Q(phase__isnull=True) | Q(phase=phase) ) none_chain_effects = none_chain_effects.filter( Q(chain__isnull=True) | (Q(chain_kind=0) & Q(chain__lte=duel.chain)) | (Q(chain_kind=1) & Q(chain__gte=duel.chain)) | (Q(chain_kind=2) & Q(chain=duel.chain)) ) if duel.timing is not None: none_chain_effects = none_chain_effects.filter(Q(timing=duel.timing)) else: none_chain_effects = none_chain_effects.filter(Q(none_timing=True)) if duel.timing2 is not None: none_chain_effects = none_chain_effects.filter(Q(timing2=duel.timing2)) else: none_chain_effects = none_chain_effects.filter(Q(none_timing2=True)) if duel.timing3 is not None: none_chain_effects = none_chain_effects.filter(Q(timing2=duel.timing3)) else: none_chain_effects = none_chain_effects.filter(Q(none_timing3=True)) none_chain_effects = none_chain_effects.order_by("-priority") eternal_det = json.loads(duel.eternal_det) flag = True for none_chain_effect in none_chain_effects: if none_chain_effect.id in eternal_det: continue eternal_wrapper = none_chain_effect.eternal_effect_next kinds = eternal_wrapper.monster_effect_kind if ( self.invoke_no_chain_effect(eternal_wrapper, user, other_user, kinds) == 0 ): eternal_det.append(none_chain_effect.id) else: flag = False break if flag is True: duel.eternal_det = json.dumps([]) else: duel.eternal_det = json.dumps(eternal_det) def retrieve_chain(self, decks, graves, hands, phase, user_turn, user, other_user): self.retrieve = 1 self.duel.canbechained = True self.duel.none = False trigger_waiting = json.loads(self.duel.trigger_waiting) tmp = None while ( self.duel.chain != 0 and self.duel.ask == 0 and self.duel.in_cost is False and tmp != "copy" ): tmp = self.retrieve_chain_det( decks, graves, hands, phase, user_turn, user, other_user ) if self.duel.winner != 0 or self.duel.winner_ai != 0: self.duel.chain = 0 self.duel.virtual_chain = 0 break self.check_eternal_effect( decks, graves, hands, phase, user_turn, user, other_user ) self.check_eternal_effect( decks, graves, hands, phase, user_turn, user, other_user ) if self.duel.chain == 0: if self.duel.in_cost is False: self.cost = {} self.mess = {} self.duel.in_pac = "{}" self.duel.chain_det_trigger = "{}" self.duel.chain_variable = "{}" self.duel.retrieve = 0 self.update = True if self.duel.is_ai is True: if self.duel.chain == 0: self.duel.appoint = self.duel.user_turn self.save_all(user, other_user, self.duel.id) def retrieve_chain_det( self, decks, graves, hands, phase, user_turn, user, other_user ): duel = self.duel self.tmp_chain = str(duel.chain) chain_det = json.loads(self.duel.chain_det) chain_user_ary = json.loads(self.duel.chain_user) current_chain = chain_det[str(self.duel.chain - 1)] chain_user = chain_user_ary[str(self.duel.chain - 1)] chain_det_trigger_json = json.loads(self.duel.chain_det_trigger) trigger_id = chain_det_trigger_json[str(duel.chain - 1)] trigger = Trigger.objects.get(id=trigger_id) if chain_user == 1: chain_no_user = 2 elif chain_user == 2: chain_no_user = 1 mess = self.mess if str(duel.chain - 1) in mess: if "invalid" in mess[str(duel.chain - 1)]: del chain_det[str(self.duel.chain - 1)] self.duel.chain_det = json.dumps(chain_det) self.duel.chain -= 1 if(trigger.chain_flag is True): self.duel.virtual_chain -= 1 return None if current_chain == 0: self.duel.chain -= 1 if(trigger.chain_flag is True): self.duel.virtual_chain -= 1 return None trigger_waiting = json.loads(self.duel.trigger_waiting) monster_effect = MonsterEffectWrapper.objects.get(id=current_chain) kinds = monster_effect.monster_effect_kind monster_effect_next = self.invoke_monster_effect( monster_effect, decks, graves, kinds ) if monster_effect_next == "copy": return "copy" if monster_effect_next is None: pac = json.loads(duel.in_pac) if str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0: pac = pac[str(self.duel.chain - 1)] else: pac = [] if pac != []: pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) monster_effect_next = pac.monster_effect_next elif monster_effect_next == -2: monster_effect_next = None while monster_effect_next: if monster_effect_next == "copy": return "copy" if duel.winner != 0 or duel.winner_ai != 0: return None if monster_effect_next == -1: return None else: chain_det[str(self.duel.chain - 1)] = monster_effect_next.id self.duel.chain_det = json.dumps(chain_det) monster_effect = monster_effect_next strategy = monster_effect.strategy strategy_up_or_down = monster_effect.strategy_up_or_down monster_effect_unwrap = monster_effect.monster_effect if monster_effect_unwrap.monster_effect_val == 5: duel.ask = 0 effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland( monster_effect_text["min_equation_number"], None,chain_user ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None,chain_user ) if self.check_monster_exists( monster_effect_text, min, max, chain_user, effect_kind, 0, whether_monster, exclude, ): if duel.is_ai is False: if duel.user_turn == 1 : if chain_user == 1: self.duel.ask = 1 else: self.duel.ask = 2 else: if chain_user == 1: self.duel.ask = 2 else: self.duel.ask = 1 else: if duel.user_turn == 1 : if chain_user == 1: self.duel.ask = 1 else: self.answer_ai(strategy,strategy_up_or_down) else: if chain_user == 1: self.duel.ask = 2 else: self.answer_ai(strategy,strategy_up_or_down) monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][1] if chain_user == 1: tmp_user = 2 else: tmp_user = 1 min = self.calculate_boland( monster_effect_text["min_equation_number"], None ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None ) if self.check_monster_exists( monster_effect_text, min, max, tmp_user, effect_kind, 0, whether_monster, exclude, ): if duel.is_ai is False: if duel.user_turn == 2 : if chain_user == 1: self.duel.ask += 1 else: self.duel.ask += 2 else: if chain_user == 1: self.duel.ask += 2 else: self.duel.ask += 1 else: if duel.user_turn == 2: if chain_user == 1: self.answer_ai(strategy,strategy_up_or_down) else: self.duel.ask += 2 else: if chain_user == 1: self.duel.ask += 2 else: self.answer_ai(strategy,strategy_up_or_down) elif ( monster_effect_unwrap.monster_effect_val == 3 or monster_effect_unwrap.monster_effect_val == 44 ): effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland( monster_effect_text["min_equation_number"], None ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None ) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if self.check_monster_exists( monster_effect_text, min, max, chain_user, effect_kind, 0, whether_monster, exclude, ): self.duel.ask_kind = effect_kind if self.duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 4: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland( monster_effect_text["min_equation_number"], None,True,eternal = True ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None,True,eternal = True ) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind if self.check_monster_exists( monster_effect_text, min, max, chain_no_user, effect_kind, 0, whether_monster, exclude, ): if self.duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 elif monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 66: effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if self.duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 66: effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if self.duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 26 or monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 67 : effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if self.duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 elif monster_effect_unwrap.monster_effect_val == 27 or monster_effect_unwrap.monster_effect_val == 63: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) min = self.calculate_boland( monster_effect_text["min_equation_number"] ) max = self.calculate_boland( monster_effect_text["max_equation_number"] ) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind if self.duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 else: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 28 or monster_effect_unwrap.monster_effect_val == 64: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) min = self.calculate_boland( monster_effect_text["min_equation_number"],True ) max = self.calculate_boland( monster_effect_text["max_equation_number"],True ) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind if self.duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 else: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 30: effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind monster_condition = monster_effect_unwrap.monster_condition if monster_condition != "": monster_condition = json.loads(monster_condition) monster_condition = monster_condition["monster"][0]["monster"] monster_effect_text_org = json.loads(monster_effect_unwrap.monster_effect) if(self.check_multiple(chain_user,effect_kind,monster_effect_text_org,monster_condition)): self.duel.ask_kind = effect_kind if self.duel.is_ai is False or user == 1: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 31: effect_kind = monster_effect.monster_effect_kind monster_condition = monster_effect_unwrap.monster_condition if monster_condition != "": monster_condition = json.loads(monster_condition) monster_condition = monster_condition["monster"][0]["monster"] monster_effect_text_org = json.loads(monster_effect_unwrap.monster_effect) if(self.check_multiple(chain_no_user,effect_kind,monster_effect_text_org,monster_condition)): self.duel.ask_kind = effect_kind if duel.is_ai is False or user == 1: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if monster_effect_unwrap.eternal_flag is True: self.check_eternal_effect( decks, graves, hands, phase, duel.user_turn, user, other_user ) effect_kind = monster_effect.monster_effect_kind trigger_waiting = json.loads(self.duel.trigger_waiting) monster_effect_next = self.invoke_monster_effect( monster_effect, decks, graves, effect_kind ) if monster_effect_next is None: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) monster_effect_next = pac.monster_effect_next elif monster_effect_next == -2: monster_effect_next = None if self.duel.ask != 0: return None del chain_det[str(self.duel.chain - 1)] self.duel.chain_det = json.dumps(chain_det) self.duel.chain -= 1 if(trigger.chain_flag is True): self.duel.virtual_chain -= 1 if self.duel.chain != 0: chain_det_ary = json.loads(self.duel.chain_det_trigger) chain_det2 = chain_det_ary[str(self.duel.chain - 1)] current_trigger = Trigger.objects.get(id=chain_det2) #if current_trigger.pac: # self._pac(current_trigger.pac) chain_user = chain_user_ary[str(self.duel.chain - 1)] current_chain = chain_det[str(self.duel.chain - 1)] if current_chain == 0: if(current_trigger.chain_flag is True): self.duel.virtual_chain -= 1 self.duel.chain -= 1 return monster_effect = MonsterEffectWrapper.objects.get(id=current_chain) monster_effect_unwrap = monster_effect.monster_effect if monster_effect_unwrap.monster_effect_val == 5: duel.ask = 0 effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland( monster_effect_text["min_equation_number"], None ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None ) if self.check_monster_exists( monster_effect_text, min, max, chain_user, effect_kind, 0, whether_monster, exclude, ): if duel.is_ai is False: if duel.user_turn == 1: if chain_user == 1: self.duel.ask = 1 else: self.duel.ask = 2 else: if chain_user == 1: self.duel.ask = 2 else: self.duel.ask = 1 else: if duel.user_turn == 1: if chain_user == 1: self.duel.ask = 1 else: self.answer_ai(strategy,strategy_up_or_down) else: if chain_user == 1: self.answer_ai(strategy,strategy_up_or_down) else: self.duel.ask = 1 monster_effect_text = json.loads( monster_effect_unwrap.monster_effect ) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][1] min = self.calculate_boland( monster_effect_text["min_equation_number"], None ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None ) if chain_user == 1: tmp_user = 2 else: tmp_user = 1 if self.check_monster_exists( monster_effect_text, min, max, tmp_user, effect_kind, 0, whether_monster, exclude, ): if duel.is_ai is False: if duel.user_turn == 2: if chain_user == 1: self.duel.ask += 1 else: self.duel.ask += 2 else: if chain_user == 2: self.duel.ask += 2 else: self.duel.ask += 1 else: if duel.user_turn == 2: if chain_user == 1: self.duel.ask += 1 else: self.answer_ai(strategy,strategy_up_or_down) else: if chain_user == 1: self.answer_ai(strategy,strategy_up_or_down) else: self.duel.ask += 1 elif ( monster_effect_unwrap.monster_effect_val == 3 or monster_effect_unwrap.monster_effect_val == 44 ): effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads( monster_effect.monster_effect.monster_effect ) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland(monster_effect_text["min_equation_number"]) max = self.calculate_boland(monster_effect_text["max_equation_number"]) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if self.check_monster_exists( monster_effect_text, min, max, chain_user, effect_kind, 0, whether_monster, exclude, ): self.duel.ask_kind = effect_kind if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 4: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland(monster_effect_text["min_equation_number"],other_user_flag=True,eternal=True) max = self.calculate_boland(monster_effect_text["max_equation_number"],other_user_flag=True,eternal=True) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if self.check_monster_exists( monster_effect_text, min, max, chain_no_user, effect_kind, 0, whether_monster, exclude, ): self.duel.ask_kind = effect_kind if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 elif monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 66: effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 26 or monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 67 : effect_kind = monster_effect.monster_effect_kind pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 elif monster_effect_unwrap.monster_effect_val == 27 or monster_effect_unwrap.monster_effect_val == 63: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) min = self.calculate_boland(monster_effect_text["min_equation_number"]) max = self.calculate_boland(monster_effect_text["max_equation_number"]) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if str(self.duel.chain - 1) in pac: pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 28 or monster_effect_unwrap.monster_effect_val == 64: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) min = self.calculate_boland( monster_effect_text["min_equation_number"], None, True ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None, True ) if min != 0 or max != 0: pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 elif monster_effect_unwrap.monster_effect_val == 30: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads( monster_effect.monster_effect.monster_effect ) pac = json.loads(duel.in_pac) if ( str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0 ): pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind if duel.is_ai is False or chain_user == 1: if duel.user_turn == chain_user: self.duel.ask = 1 else: self.duel.ask = 2 elif monster_effect_unwrap.monster_effect_val == 31: effect_kind = monster_effect.monster_effect_kind if str(self.duel.chain - 1) in pac: pac = pac[str(self.duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind if duel.is_ai is False or chain_user == 2: if duel.user_turn == chain_user: self.duel.ask = 2 else: self.duel.ask = 1 else: self.answer_ai(strategy,strategy_up_or_down) def invoke_cost(self, cost, chain): duel = self.duel cost_unwrap = cost.cost chain_user = json.loads(duel.chain_user) user = chain_user[str(chain)] effect_kind = self.get_pac_cost_effect_kind() if effect_kind is None: effect_kind = cost.cost_kind if cost_unwrap.cost_val == 0: cost_condition = json.loads(cost_unwrap.cost_condition) duel.cost_log += self.write_log(cost.log, user) if self.check_cost_condition(cost_condition, effect_kind): if cost.pac: return self._pac_cost(cost.pac) else: if cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) else: if cost.pac2: return self._pac_cost(cost.pac2) else: if cost.cost_next2: return cost.cost_next2 else: return self.pop_pac_cost2(user) elif cost_unwrap.cost_val == 35: data_tmp = self.copy_monster_cost( cost_unwrap.cost, cost_unwrap.cost_condition, effect_kind ) log_tmp = self.write_log(cost.log, user, data_tmp) duel.cost_log += log_tmp if cost.pac: return self._pac_cost(cost.pac) else: if cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 48: return_value = self.copy_special_effect(cost_unwrap, effect_kind) if isinstance(return_value,int): return return_value data = {} data["monsters"] = return_value[1] log_tmp = self.write_log(cost.log, user,data) duel.cost_log += log_tmp return return_value[0] elif cost_unwrap.cost_val == 56: self.clear_cost_mess(cost_unwrap.cost) if cost.pac: return self._pac_cost(cost.pac) else: if cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 33: log_tmp = self.write_log(cost.log, user) duel.cost_log += log_tmp self.clear_relation_cost( cost_unwrap.cost, effect_kind, cost_unwrap.cost_condition ) if cost.pac: return self._pac_cost(cost.pac) else: if cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif ( cost_unwrap.cost_val == 5 or cost_unwrap.cost_val == 4 or cost_unwrap.cost_val == 3 or cost_unwrap.cost_val == 27 or cost_unwrap.cost_val == 28 or cost_unwrap.cost_val == 63 or cost_unwrap.cost_val == 64 ): duel.cost_log += self.write_log(cost.log, user) if self.duel.ask > 0 : self.duel.ask_det = cost.cost.cost return -1 else: if user == 2 and duel.is_ai is True: return self.do_cost_next_ai(cost,user) else: return self.do_cost_next(cost,user) elif cost_unwrap.cost_val == 17: cost_kind = cost.cost_kind duel.cost_log += self.write_log(cost.log, user) move_to = self.move_from_monster_simple_cost(cost_kind) if move_to is not None: self.move_to_monster_cost(move_to, cost_kind) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 25: log_tmp = self.write_log(cost.log, user) duel.cost_log += log_tmp self.change_monster_relation_cost( cost_unwrap.cost, effect_kind, cost_unwrap.cost_condition ) elif cost_unwrap.cost_val == 36: move_to = self.move_from_monster_cost(effect_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: log_tmp = self.write_log(cost.log, user, data) duel.cost_log += log_tmp if move_to is not None: self.move_to_under_monster_cost(move_to, effect_kind) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 1: cost_kind = cost.cost_kind move_to = self.move_from_monster_cost(cost_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: log_tmp = self.write_log(cost.log, user, data) duel.cost_log += log_tmp if move_to is not None: self.move_to_monster_cost(move_to, cost_kind) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 40: cost_kind = cost.cost_kind move_to = self.move_from_monster_relation_cost(cost_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: log_tmp = self.write_log(cost.log, user, data) duel.cost_log += log_tmp if move_to is not None: self.move_to_monster_cost(move_to, cost_kind) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 7: duel.cost_log += self.write_log(cost.log, user) self.move_phase_cost() if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 8: duel.cost_log += self.write_log(cost.log, user) self.change_turn_cost() if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 2: change_val = self.change_variable_cost() data = {} data["val"] = change_val if change_val != 0: duel.cost_log = self.write_log(cost.log, user, data) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 34: data_tmp = self.change_variable_by_monster_cost() data = {} data["monsters"] = data_tmp[0] data["val"] = data_tmp[1] if data["val"] != 0: duel.cost_log += self.write_log(cost.log, user, data) if cost.pac: return self._pac_cost(cost.pac) else: if cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 9: data = {} cost_kind = cost.cost_kind data2 = self.change_monster_variable_eternal_cost( cost_unwrap.cost, cost_kind, cost_unwrap.cost_condition,cost_unwrap.change_val_monster_flag,cost_unwrap.accumulate_flag ) data["monsters"] = data2[0] data["val"] = data2[1] duel.cost_log += self.write_log(cost.log, user,data) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 29: duel.cost_log += self.write_log(cost.log, user) self.change_variable_multiple_cost(cost) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 10: duel.cost_log += self.write_log(cost.log, user) self.shuffle_cost() if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 11: duel.cost_log += self.write_log(cost.log, user) self.clear_cost() if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 18: duel.cost_log += self.write_log(cost.log, user) self.move_effect_variable_to_timing(1) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 20: duel.cost_log += self.write_log(cost.log, user) self.cancel_cost() return -4 elif cost_unwrap.cost_val == 21: duel.cost_log += self.write_log(cost.log, user) self.play_music(cost_unwrap.cost) if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) elif cost_unwrap.cost_val == 68: duel.cost_log += self.write_log(cost.log, user) self.end_cost(user,org_chain,trigger,True) self.duel.in_cost_cancel = False if cost.pac: return self._pac_cost(cost.pac) elif cost.cost_next: return cost.cost_next else: return self.pop_pac_cost(user) def play_music(self, music_name): self.duel.audio = music_name return def sound_effect_effect(self, monster_effect,cost = 0,user=None): duel = self.duel if user is None: if cost == 0: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] elif cost == 1: chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] else: user = self.user data = monster_effect.split(",") sound_effect_id = str(uuid.uuid4()) if(data[0] == "1"): if user == 1: if self.duel.sound_effect_1 == "": self.duel.sound_effect_1 = data[1] + "_" + sound_effect_id else: self.duel.sound_effect_1 += ","+data[1] + "_" + sound_effect_id else: if self.duel.sound_effect_2 == "": self.duel.sound_effect_2 = data[1] + "_" + sound_effect_id else: self.duel.sound_effect_2 += ","+data[1] + "_" + sound_effect_id elif(data[0] == "2"): if user == 2: if self.duel.sound_effect_1 == "": self.duel.sound_effect_1 = data[1] + "_" + sound_effect_id else: self.duel.sound_effect_1 += ","+data[1] + "_" + sound_effect_id else: if self.duel.sound_effect_2 == "": self.duel.sound_effect_2 = data[1] + "_" + sound_effect_id else: self.duel.sound_effect_2 += ","+data[1] + "_" + sound_effect_id elif(data[0] == "3"): if self.duel.sound_effect_1 == "": self.duel.sound_effect_1 = data[1] + "_" + sound_effect_id else: self.duel.sound_effect_1 += ","+data[1] + "_" + sound_effect_id if self.duel.sound_effect_2 == "": self.duel.sound_effect_2 = data[1] + "_" + sound_effect_id else: self.duel.sound_effect_2 += ","+data[1] + "_" + sound_effect_id return def win_the_game_by_time(self): duel = self.duel self.duel.end_time = time() self.turn_changed = True user = self.user if self.duel.winner == 0: self.duel.winner = user self.duel.save() if user == 1: if self.duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.win += 1 user_point.point += 5 user_point.save(); if self.duel.user_2 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_2 user_point2.lose += 1 user_point2.save(); elif user == 2: if self.duel.user_2 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_2 user_point.win += 1 user_point.point += 5 user_point.save(); if self.duel.user_1 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_1 user_point2.lose += 1 user_point2.save(); def win_the_game_user(self,user): duel = self.duel self.duel.end_time = time() self.turn_changed = True if self.duel.guest_flag is False: user1_name = duel.user_1.first_name else: user1_name = duel.guest_name if self.duel.is_ai is False: if self.duel.guest_flag2 is False: user2_name = duel.user_2.first_name else: user2_name = duel.guest_name2 else: user2_name = "NPC" if user == 1: duel.log_turn += user1_name+ "の勝ち" duel.log += user1_name+ "の勝ち" else: duel.log_turn += user2_name+ "の勝ち" duel.log += user2_name+ "の勝ち" if self.duel.winner == 0 and duel.is_ai is False: self.duel.winner = user self.duel.save() if user == 1: if self.duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.win += 1 user_point.point += 10 user_point.save(); if self.duel.user_2 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_2 user_point2.lose += 1 user_point2.save(); elif user == 2: if self.duel.user_2 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_2 user_point.win += 1 user_point.point += 10 user_point.save(); if self.duel.user_1 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_1 user_point2.lose += 1 user_point2.save(); elif self.duel.winner_ai == 0 and duel.is_ai is True: self.duel.winner_ai = user self.duel.save() if duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.point += 5 user_point.win_ai += 1 user_point.save(); def win_the_game(self, cost=0): duel = self.duel self.duel.end_time = time() self.turn_changed = True if cost == 0: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] elif cost == 1: chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] else: user = self.user if self.duel.winner == 0 and duel.is_ai is False: self.duel.winner = user self.duel.save() if user == 1: if self.duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.win += 1 user_point.point += 10 user_point.save(); if self.duel.user_2 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_2 user_point2.lose += 1 user_point2.save(); elif user == 2: if self.duel.user_2 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_2 user_point.win += 1 user_point.point += 10 user_point.save(); if self.duel.user_1 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_1 user_point2.lose += 1 user_point2.save(); elif self.duel.winner_ai == 0 and duel.is_ai is True: self.duel.winner_ai = user self.duel.save() if duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.point += 5 user_point.win_ai += 1 user_point.save(); def draw_the_game(self, cost=0): self.turn_changed = True duel = self.duel self.duel.end_time = time() if cost == 0: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] elif cost == 1: chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] else: user = self.user if self.duel.winner == 0: self.duel.winner = 3 self.duel.save() if duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.draw += 1 user_point.save() if duel.user_2 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_2 user_point2.draw += 1 user_point2.save() return def lose_the_game_by_time(self): self.turn_changed = True duel = self.duel self.duel.end_time = time() user = self.user if self.duel.winner == 0 and duel.is_ai is False: if user == 1: self.duel.winner = 2 elif user == 2: self.duel.winner = 1 self.duel.save() if user == 2: if duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.win += 1 user_point.point += 5 user_point.save(); if duel.user_2 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_2 user_point2.lose += 1 user_point2.save(); elif user == 1: if duel.user_2 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_2 user_point.win += 1 user_point.point += 5 user_point.save(); if duel.user_1 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_1 user_point2.lose += 1 user_point2.save(); elif self.duel.winner_ai == 0 and duel.is_ai is True: if user == 1: self.duel.winner_ai = 2 elif user == 2: self.duel.winner_ai = 1 user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.win_ai += 1 user_point.point += 5 user_point.save(); self.duel.save() return def lose_the_game(self, cost=0): self.turn_changed = True duel = self.duel self.duel.end_time = time() if cost == 0: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] elif cost == 1: chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] else: user = self.user if self.duel.winner == 0 and duel.is_ai is False: if user == 1: self.duel.winner = 2 elif user == 2: self.duel.winner = 1 self.duel.save() if user == 2: if duel.user_1 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.win += 1 user_point.point += 10 user_point.save(); if duel.user_2 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_2 user_point2.lose += 1 user_point2.save(); elif user == 1: if duel.user_2 is not None: user_point = UserPoint.objects.filter(user = self.duel.user_2).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_2 user_point.win += 1 user_point.point += 10 user_point.save(); if duel.user_1 is not None: user_point2 = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point2 is None: user_point2 = UserPoint() user_point2.user = self.duel.user_1 user_point2.lose += 1 user_point2.save(); elif self.duel.winner_ai == 0 and duel.is_ai is True: if user == 1: self.duel.winner_ai = 2 elif user == 2: user_point = UserPoint.objects.filter(user = self.duel.user_1).first() if user_point is None: user_point = UserPoint() user_point.user = self.duel.user_1 user_point.win_ai += 1 user_point.point += 5 user_point.save(); self.duel.winner_ai = 1 self.duel.save() return def cancel_cost(self): duel = self.duel in_pac = json.loads(duel.in_pac) in_pac[str(duel.chain - 1)] = [] duel.cost_log = "" duel.in_cost = False self.in_execute = False duel.in_pac_cost = "[]" cost = self.cost if duel.chain == 0: del cost[str(self.tmp_chain)] elif duel.chain >0: del cost[str(duel.chain)] self.cost = cost self.cost_result = {} duel.ask = 0 duel.canbechained = True ''' if duel.chain > 0: chain_det_trigger_json = json.loads(duel.chain_det_trigger) del chain_det_trigger_json[str(duel.chain)] duel.chain_det_trigger = json.dumps(chain_det_trigger_json) trigger_id = chain_det_trigger_json[str(duel.chain - 1)] trigger = Trigger.objects.get(id=trigger_id) if trigger.pac: in_pac[str(duel.chain - 1)].append(trigger.pac.id) duel.in_pac = json.dumps(in_pac) ''' self.duel.tmponce_per_turn1 = "" self.duel.tmponce_per_turn_group1 = "" self.duel.tmponce_per_turn_group2 = "" self.duel.tmponce_per_turn_monster_group1 = "" self.duel.tmponce_per_turn_monster_group2 = "" self.duel.tmponce_per_turn2 = "" self.duel.tmponce_per_turn_monster1 = "" self.duel.tmponce_per_turn_monster2 = "" self.duel.tmponce_per_turn_exist1 = "" self.duel.tmponce_per_turn_exist2 = "" self.duel.tmponce_per_turn_relate1 = "" self.duel.tmponce_per_turn_relate2 = "" self.mess[str(self.duel.chain)] = [] return def check_monster_effect_timing_and_phase_condition(self, monster_effect_condition): duel = self.duel if "check_phase" in monster_effect_condition: check_phases = str(monster_effect_condition["check_phase"]).split("_") flag = False for check_phase in check_phases: if duel.phase.id == int(check_phase): flag = True if flag is False: return False if "check_timing" in monster_effect_condition: check_timings = str(monster_effect_condition["check_timing"]).split("_") flag = False for check_timing in check_timings: if duel.timing is None: 0 == int(check_timing) elif duel.timing.id == int(check_timing): flag = True if flag is False: return False if "check_timing2" in monster_effect_condition: check_timings2 = str(monster_effect_condition["check_timing2"]).split("_") flag = False for check_timing2 in check_timings2: if duel.timing2.id == int(check_timing2): flag = True if flag is False: return False if "check_timing3" in monster_effect_condition: check_timings3 = str(monster_effect_condition["check_timing3"]).split("_") flag = False for check_timing3 in check_timings3: if duel.timing3.id == int(check_timing3): flag = True if flag is False: return False return True def check_cost_condition(self, cost_condition, cost_kind): return self.check_monster_effect_condition(cost_condition, cost_kind, 1) def check_monster_effect_condition( self, monster_effect_condition, effect_kind="", cost=0 ): duel = self.duel if cost == 0: chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] elif cost == 1: chain_user = json.loads(duel.chain_user) user = chain_user[str(self.tmp_chain)] else: user = self.user if "monster" in monster_effect_condition: if "choose" in monster_effect_condition: choose = monster_effect_condition["choose"] else: choose = 0 excludes = False if "exclude" in monster_effect_condition: exclude = monster_effect_condition["exclude"] if exclude: excludes = exclude.split(",") if ( self.check_monster_condition( monster_effect_condition["monster"], user, False, None, excludes, choose, effect_kind, ) is False ): return False if "variable" in monster_effect_condition: variable_flag = True current_and_or = "and" for key in range(len(monster_effect_condition["variable"])): variable_condition = monster_effect_condition variable = monster_effect_condition["variable"][key]["variable"] variable = variable.split("_") mine_or_other = int(variable[2]) variable_name = variable[1] variable = json.loads(duel.global_variable) virtual_variables = self.virtual_variables variable.update(virtual_variables) if variable_name == "chain": if variable_condition["variable"][key]["variable_equation"] == "=": if not duel.virtual_chain == self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not duel.virtual_chain <= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not duel.virtual_chain >= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not duel.virtual_chain != self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif variable_name == "turncount": if variable_condition["variable"][key]["variable_equation"] == "=": if not duel.turn_count == self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not duel.turn_count <= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not duel.turn_count >= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not duel.turn_count != self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif mine_or_other == 0: if variable_condition["variable"][key]["variable_equation"] == "=": if not variable[variable_name][ "value" ] == self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not variable[variable_name][ "value" ] <= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not variable[variable_name][ "value" ] >= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not variable[variable_name][ "value" ] != self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( mine_or_other == 1 and user == 1 or mine_or_other == 2 and user == 2 ): if variable_condition["variable"][key]["variable_equation"] == "=": if not variable[variable_name][ "1_value" ] == self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not variable[variable_name][ "1_value" ] <= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not variable[variable_name][ "1_value" ] >= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not variable[variable_name][ "1_value" ] != self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( mine_or_other == 2 and user == 1 or mine_or_other == 1 and user == 2 ): if variable_condition["variable"][key]["variable_equation"] == "=": if not variable[variable_name][ "2_value" ] == self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "<=" ): if not variable[variable_name][ "2_value" ] <= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == ">=" ): if not variable[variable_name][ "2_value" ] >= self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True elif ( variable_condition["variable"][key]["variable_equation"] == "!=" ): if not variable[variable_name][ "2_value" ] != self.calculate_boland( variable_condition["variable"][key]["variable_val"] ): if current_and_or == "and" or variable_flag is False: variable_flag = False else: if current_and_or == "or" or variable_flag is True: variable_flag = True current_and_or = variable_condition["variable"][key]["and_or"] return variable_flag def pop_pac_cost(self, user): duel = self.duel if duel.in_pac_cost == "[]": return -2 pac = json.loads(duel.in_pac_cost) pac_id = pac.pop() duel.in_pac_cost = json.dumps(pac) pac = PacCostWrapper.objects.get(id=pac_id) duel.cost_log += self.write_log(pac.log, user) if pac.pac_next is not None: return self._pac_cost(pac.pac_next) if pac.cost_next is None: return -2 else: return pac.cost_next def pop_pac_cost2(self, user): duel = self.duel if duel.in_pac_cost == "[]": return -2 pac = json.loads(duel.in_pac_cost) pac_id = pac.pop() duel.in_pac_cost = json.dumps(pac) pac = PacCostWrapper.objects.get(id=pac_id) duel.cost_log += self.write_log(pac.log, user) if pac.pac_next2 is not None: return self._pac_cost(pac.pac_next2) if pac.cost_next2 is None: return -2 else: return pac.cost_next2 def get_pac_effect_kind(self): duel = self.duel pac = json.loads(duel.in_pac) if str(self.duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0: pac = pac[str(self.duel.chain - 1)] pac_id = pac[0] pac = PacWrapper.objects.get(id=pac_id) else: return None if pac.monster_effect_kind == "": return None else: return pac.monster_effect_kind def get_pac_cost_effect_kind(self): duel = self.duel if duel.in_pac_cost == "[]": return None pac = json.loads(duel.in_pac_cost) pac_id = pac[0] pac = PacCostWrapper.objects.get(id=pac_id) if pac.monster_effect_kind == "": return None else: return pac.monster_effect_kind def pop_pac(self, user): duel = self.duel pac = json.loads(duel.in_pac) if str(duel.chain - 1) not in pac or len(pac[str(duel.chain - 1)]) == 0: return -2 pac_id = pac[str(duel.chain - 1)].pop() duel.in_pac = json.dumps(pac) pac = PacWrapper.objects.get(id=pac_id) log_tmp = self.write_log(pac.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if pac.pac_next is not None: return self._pac(pac.pac_next) if pac.monster_effect_next is None: return -2 else: return pac.monster_effect_next def pop_pac2(self, user): duel = self.duel pac = json.loads(duel.in_pac) if str(duel.chain - 1) not in pac or len(pac[str(duel.chain - 1)]) == 0: return -2 pac_id = pac[str(duel.chain - 1)].pop() duel.in_pac = json.dumps(pac) pac = PacWrapper.objects.get(id=pac_id) log_tmp = self.write_log(pac.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if pac.pac_next2 is not None: return self._pac(pac.pac_next2) if pac.monster_effect_next2 is None: return -2 else: return pac.monster_effect_next2 def _pac(self, effect_pac, chain=None,flag = 0): if flag == 1: return effect_pac.pac.pac_next duel = self.duel pac = json.loads(duel.in_pac) if chain is None: chain = duel.chain - 1 if str(chain) not in pac or len(pac[str(chain)]) == 0: pac[str(chain)] = [] pac[str(chain)].append(effect_pac.id) duel.in_pac = json.dumps(pac) return effect_pac.pac.pac_next def _pac_cost(self, cost_pac): duel = self.duel pac = json.loads(duel.in_pac_cost) pac.append(cost_pac.id) duel.in_pac_cost = json.dumps(pac) return cost_pac.pac_cost.pac_cost_next def get_trigger_monster(self): duel = self.duel mess = self.mess if str(duel.chain - 1) not in mess: return None if 0 not in mess[str(duel.chain - 1)]: return None trigger = mess[str(duel.chain - 1)][0] return trigger def do_immidiate_trigger(self,trigger,user): duel = self.duel monster_effect = trigger.next_effect monster_effect_unwrap = monster_effect.monster_effect if monster_effect_unwrap.monster_effect_val == 60: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.sound_effect_effect(monster_effect.monster_effect.monster_effect,2,user) return def check_invoke_monster_effect( self, monster, user, effect_kind, place, deck_id, x, y, mine_or_other, monster_from, place_from, deck_id_from, from_x, from_y, ): if self.check_invoke_invalid( monster, user, effect_kind, place, deck_id, x, y, mine_or_other ): return False if self.check_invoke_invalid( monster_from, user, effect_kind, place_from, deck_id_from, from_x, from_y, mine_or_other, 1, ): return False return True def invoke_no_chain_effect(self, monster_effect, user, other_user, kinds): duel = self.duel user = self.user while monster_effect: if duel.winner != 0 or duel.winner_ai != 0: return # monster_effect_unwrapは効果の実体 monster_effect_unwrap = monster_effect.monster_effect if monster_effect_unwrap.monster_effect_val == 0: monster_effect_condition = json.loads( monster_effect.monster_effect.monster_condition ) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind if self.check_monster_effect_condition( monster_effect_condition, effect_kind, 2 ): monster_effect = monster_effect.monster_effect_next else: monster_effect = monster_effect.monster_effect_next2 elif ( monster_effect_unwrap.monster_effect_val == 5 or monster_effect_unwrap.monster_effect_val == 4 or monster_effect_unwrap.monster_effect_val == 3 ): log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if self.duel.ask > 0: duel.in_eternal = True effect_kind = monster_effect.monster_effect_kind self.duel.ask_kind = effect_kind self.duel.ask_det = monster_effect_unwrap.monster_effect return -1 else: monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 17: effect_kind = monster_effect.effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster_simple_eternal( effect_kind, user, monster_effect ) log_tmp = self.write_log(monster_effect.log, user, move_to) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if move_to is not None: self.move_to_monster_eternal( move_to, effect_kind, user, monster_effect ) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 1: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster_eternal( effect_kind, user, monster_effect ) if move_to is not None: self.move_to_monster_eternal( move_to, effect_kind, user, monster_effect ) data = {} data["monsters"] = move_to log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 40: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster_relation(effect_kind) if move_to is not None: self.move_to_monster(move_to, effect_kind) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 33: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind self.clear_relation( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, ) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 7: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.move_phase() monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 37: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind return self.copy_effect(monster_effect_unwrap, effect_kind) elif monster_effect_unwrap.monster_effect_val == 46: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind return self.copy_effect2(monster_effect_unwrap, effect_kind) elif monster_effect_unwrap.monster_effect_val == 8: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.change_turn(monster_effect_unwrap) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 2: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.change_variable(2,monster_effect_unwrap) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 9: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind self.change_monster_variable_eternal( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, monster_effect_unwrap.change_val_monster_flag, monster_effect_unwrap.accumulate_flag, ) elif monster_effect_unwrap.monster_effect_val == 29: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.change_variable_multiple(0, user, monster_effect) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 25: effect_kind = monster_effect.monster_effect_kind return_value = self.change_monster_relation( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, ) log_tmp = self.write_log_change_monster_relation( monster_effect.log, return_value ) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 32: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind effect_kind_rel = monster_effect.monster_effect_kind_rel self.change_monster_variable_relation( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, effect_kind_rel, ) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 10: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.shuffle() monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 11: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.clear() monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 12: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.raise_by_monster_effect() monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 13: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.change_appointment() monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 14: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp monster_effect_text = json.loads( monster_effect.monster_effect.monster_effect ) timing = Timing.objects.get( id=int(monster_effect_text["move_to_timing"]) ) if "timing_fresh" in monster_effect_text: fresh= monster_effect_text["timing_fresh"] else: fresh= True self.change_timing(timing.id,fresh,int(monster_effect_text["t_num"])) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 19: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if duel.timing3 is not None: self.expire_timing(duel.timing3,duel.timing3.next_timing, duel.user_turn) duel.timing3 = duel.timing3.next_timing elif duel.timing2 is not None: self.expire_timing(duel.timing2,duel.timing2.next_timing, duel.user_turn) duel.timing2 = duel.timing2.next_timing elif duel.timing is not None: self.expire_timing(duel.timing,duel.timing.next_timing, duel.user_turn) duel.timing = duel.timing.next_timing if duel.timing is None and duel.timing2 is None and duel.timing3 is None: self.timing_mess = {} monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 18: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.move_effect_variable_to_timing(0) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 60: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.sound_effect_effect(monster_effect.monster_effect.monster_effect,-1) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 61: self.change_appoint(monster_effect.monster_effect.monster_effect) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 21: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.play_music(monster_effect.monster_effect.monster_effect) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 22: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.win_the_game(2) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 23: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.lose_the_game(2) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 47: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.draw_the_game(2) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 30: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.select_multiple() monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 31: log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.select_multiple_other() monster_effect = monster_effect.monster_effect_next return 0 def invoke_monster_effect(self, monster_effect, decks, graves, kinds): duel = self.duel trigger_info = self.get_trigger_monster() chain_user = json.loads(duel.chain_user) user = chain_user[str(duel.chain - 1)] if user == 1: other_user = 2 elif user == 2: other_user = 1 if trigger_info is None: trigger_det = None trigger_place = None trigger_deck_id = 0 trigger_x = 0 trigger_y = 0 trigger_det_from = None trigger_place_from = None trigger_deck_id_from = 0 trigger_from_x = 0 trigger_from_y = 0 if not self.check_invoke_monster_effect( trigger_det, user, kinds, trigger_place, trigger_deck_id, trigger_x, trigger_y, 1, trigger_det_from, trigger_place_from, trigger_deck_id_from, trigger_from_x, trigger_from_y, ): return self.do_next(monster_effect,user) strategy = monster_effect.strategy strategy_up_or_down = monster_effect.strategy_up_or_down monster_effect_unwrap = monster_effect.monster_effect if monster_effect_unwrap.monster_effect_val == 22: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.win_the_game(2) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 23: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.lose_the_game(2) monster_effect = monster_effect.monster_effect_next elif monster_effect_unwrap.monster_effect_val == 47: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.draw_the_game(2) monster_effect = monster_effect.monster_effect_next if monster_effect_unwrap.monster_effect_val == 62: if self.each(monster_effect_unwrap.monster_effect) is True: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2 is None: return self.pop_pac2(user) else: return monster_effect.monster_effect_next2 if monster_effect_unwrap.monster_effect_val == 79: multiple_json = json.loads(monster_effect_unwrap.monster_effect) rand_i = random.randrange(len((multiple_json["monster_effect_wrapper"]))) return MonsterEffectWrapper.objects.get(id=int(multiple_json["monster_effect_wrapper"][rand_i])) elif monster_effect_unwrap.monster_effect_val == 45: rand_i = random.randrange(2) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if rand_i == 0: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2 is None: return self.pop_pac2(user) else: return monster_effect.monster_effect_next2 elif monster_effect_unwrap.monster_effect_val == 53: result = self.check_alt_val( monster_effect_unwrap.monster_effect, monster_effect.monster_effect_kind ) if result: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2 is None: return self.pop_pac2(user) else: return monster_effect.monster_effect_next2 if monster_effect_unwrap.monster_effect_val == 42: duel.mute = 1 if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 52: change_val = self.flush_acc(monster_effect_unwrap) data = {} data["val"] = change_val if change_val != 0: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 41: monster_effect_condition = json.loads(monster_effect_unwrap.monster_effect) self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if self.check_monster_effect_timing_and_phase_condition( monster_effect_condition ): if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2 is None: return self.pop_pac2(user) else: return monster_effect.monster_effect_next2 if monster_effect_unwrap.monster_effect_val == 0: monster_effect_condition = json.loads( monster_effect_unwrap.monster_condition ) self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if self.check_monster_effect_condition(monster_effect_condition): if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: tmp = self.pop_pac(user) return tmp else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2 is None: return self.pop_pac2(user) else: return monster_effect.monster_effect_next2 if monster_effect_unwrap.monster_effect_val == 43: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp next_effect = self.get_next_effect( monster_effect_unwrap.monster_effect, user ) return next_effect if monster_effect_unwrap.monster_effect_val == 5: duel.ask = 0 effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland(monster_effect_text["min_equation_number"]) max = self.calculate_boland(monster_effect_text["max_equation_number"]) if min != 0 or max != 0: if self.check_monster_exists( monster_effect_text, min, max, user, effect_kind, 0, whether_monster, exclude, ): self.duel.ask_kind = effect_kind if duel.is_ai is False: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 else: if duel.user_turn == user: if user == 1: self.duel.ask = 1 else: self.answer_ai(strategy,strategy_up_or_down) else: if user == 1: self.duel.ask = 2 else: self.answer_ai(strategy,strategy_up_or_down) monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][1] min = self.calculate_boland(monster_effect_text["min_equation_number"]) max = self.calculate_boland(monster_effect_text["max_equation_number"]) if min != 0 or max != 0: if self.check_monster_exists( monster_effect_text, min, max, other_user, effect_kind, 0, whether_monster, exclude, ): self.duel.ask_kind = effect_kind if duel.is_ai is False : if duel.user_turn == user: self.duel.ask += 2 else: self.duel.ask += 1 else: if duel.user_turn == other_user: if other_user == 1: self.duel.ask += 1 else: self.answer_ai(strategy,strategy_up_or_down) else: if other_user == 1: self.duel.ask += 2 else: self.answer_ai(strategy,strategy_up_or_down) if duel.ask == 0: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 54: effect_kind = monster_effect.monster_effect_kind elif monster_effect_unwrap.monster_effect_val == 57 or monster_effect_unwrap.monster_effect_val == 65 : effect_kind = monster_effect.monster_effect_kind if duel.user_turn == 1 or duel.is_ai is False: self.duel.ask = 1 else: self.answer_ai(strategy,strategy_up_or_down) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 55: effect_kind = monster_effect.monster_effect_kind if duel.user_turn == 2 or duel.is_ai is False: self.duel.ask = 2 else: self.answer_ai(strategy,strategy_up_or_down) if monster_effect.pac: return self._pac(monster_effect.pac,None) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 3: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland(monster_effect_text["min_equation_number"]) max = self.calculate_boland(monster_effect_text["max_equation_number"]) if min != 0 or max != 0: if self.check_monster_exists( monster_effect_text, min, max, user, effect_kind, 0, whether_monster, exclude, ): self.duel.ask_kind = effect_kind if duel.is_ai is False or user == 1: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 else: self.answer_ai(strategy,strategy_up_or_down) if monster_effect.pac: return self._pac(monster_effect.pac,None) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: return self.do_next(monster_effect,user) else: return self.do_next(monster_effect,user) elif monster_effect_unwrap.monster_effect_val == 4: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) whether_monster = monster_effect_text["whether_monster"] exclude = monster_effect_text["exclude"] monster_effect_text = monster_effect_text["monster"][0] min = self.calculate_boland( monster_effect_text["min_equation_number"], None, True,eternal=True ) max = self.calculate_boland( monster_effect_text["max_equation_number"], None, True,eternal=True ) if min != 0 or max != 0: if self.check_monster_exists( monster_effect_text, min, max, other_user, effect_kind, 0, whether_monster, exclude, ): self.duel.ask_kind = effect_kind if duel.is_ai is False or user == 2: if duel.user_turn == user: self.duel.ask = 2 else: self.duel.ask = 1 else: self.answer_ai(strategy,strategy_up_or_down) if monster_effect.pac: return self._pac(monster_effect.pac,None) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: return self.do_next(monster_effect,user) else: return self.do_next(monster_effect,user) elif monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 66: effect_kind = monster_effect.monster_effect_kind self.duel.ask_kind = effect_kind if duel.is_ai is False or user == 1: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 else: self.answer_ai(strategy,strategy_up_or_down) if monster_effect.pac: return self._pac(monster_effect.pac,None) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 26 or monster_effect_unwrap.monster_effect_val == 16 or monster_effect_unwrap.monster_effect_val == 67 : effect_kind = monster_effect.monster_effect_kind self.duel.ask_kind = effect_kind if duel.is_ai is False or user == 2: if duel.user_turn == user: self.duel.ask = 2 else: self.duel.ask = 1 else: self.answer_ai(strategy,strategy_up_or_down) if monster_effect.pac: return self._pac(monster_effect.pac,None) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 27 or monster_effect_unwrap.monster_effect_val == 63: effect_kind = monster_effect.monster_effect_kind monster_effect_text = json.loads(monster_effect_unwrap.monster_effect) min = self.calculate_boland(monster_effect_text["min_equation_number"]) max = self.calculate_boland(monster_effect_text["max_equation_number"]) if min != 0 or max != 0: self.duel.ask_kind = effect_kind if duel.is_ai is False or user == 1: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 else: self.answer_ai(strategy,strategy_up_or_down) if monster_effect.pac: return self._pac(monster_effect.pac 0: effect_kind = monster_effect.monster_effect_kind pac = json.loads(self.duel.in_pac) if str(duel.chain - 1) in pac and len(pac[str(duel.chain - 1)]) > 0: pac = pac[str(duel.chain - 1)] pac_id = pac.pop() pac = PacWrapper.objects.get(id=pac_id) if pac.monster_effect_kind != "": effect_kind = pac.monster_effect_kind self.duel.ask_kind = effect_kind self.duel.ask_det = monster_effect_unwrap.monster_effect return -1 if monster_effect_unwrap.monster_effect_val == 0: monster_effect_condition = json.loads( monster_effect.monster_effect.monster_condition ) self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind if self.check_monster_effect_condition( monster_effect_condition, effect_kind ): if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2 is None: return self.pop_pac2(user) else: return monster_effect.monster_effect_next2 elif monster_effect_unwrap.monster_effect_val == 43: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp next_effect = self.get_next_effect( monster_effect_unwrap.monster_effect, user ) return next_effect elif monster_effect_unwrap.monster_effect_val == 56: self.clear_mess(monster_effect_unwrap.monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 58: self.reload_mess(monster_effect_unwrap.monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 69: self.reload2_mess(monster_effect_unwrap.monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 51: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster_under(effect_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if move_to is not None: self.move_to_monster(move_to, effect_kind) if monster_effect.if_not_to_2 is False or move_to: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2: return monster_effect.monster_effect_next2 else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 17: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster_simple(effect_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if move_to is not None: self.move_to_monster(move_to, effect_kind) if monster_effect.if_not_to_2 is False or move_to: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2: return monster_effect.monster_effect_next2 else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 50: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster(effect_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if move_to is not None: self.move_to_over_monster(move_to, effect_kind) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 36: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster(effect_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if move_to is not None: self.move_to_under_monster(move_to, effect_kind) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 6: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 76: chain_det_ary = json.loads(self.duel.chain_det_trigger) chain_det = chain_det_ary[str(self.duel.chain - 1)] trigger = Trigger.objects.get(id=chain_det) if self.get_fusion_monster(trigger.fusion_monster, user, trigger,1,1): if duel.is_ai is False or user == 1: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 return -1 else: if self.answer_ai(strategy,strategy_up_or_down): if monster_effect.pac: return self._pac(monster_effect.pac,None) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) return self.do_next(monster_effect,user) else: return self.do_next(monster_effect,user) elif monster_effect_unwrap.monster_effect_val == 78: return self.unique_fusion_effect() elif monster_effect_unwrap.monster_effect_val == 77: chain_det_ary = json.loads(self.duel.chain_det_trigger) chain_det = chain_det_ary[str(self.duel.chain - 1)] trigger = Trigger.objects.get(id=chain_det) if self.get_fusion_material(monster_effect_unwrap,user, trigger,1,1): if duel.is_ai is False or user == 1: if duel.user_turn == user: self.duel.ask = 1 else: self.duel.ask = 2 return -1 else: if self.answer_ai(strategy,strategy_up_or_down): if monster_effect.pac: return self._pac(monster_effect.pac,None) else: if monster_effect.monster_effect_next is not None: return monster_effect.monster_effect_next else: return self.pop_pac(user) return self.do_next(monster_effect,user) else: return self.do_next(monster_effect,user) elif monster_effect_unwrap.monster_effect_val == 74: self.check_eternal_effect( decks, graves, hands, duel.phase, duel.user_turn, user, other_user ) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 73: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster(effect_kind) if move_to == []: pass else: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 1: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.move_from_monster(effect_kind) data = {} data["monsters"] = move_to if move_to == []: pass else: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if move_to is not None: self.move_to_monster(move_to, effect_kind) if monster_effect.if_not_to_2 is False or move_to: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2: return monster_effect.monster_effect_next2 else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 40: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind effect_kind_rel = monster_effect.monster_effect_kind_rel move_to = self.move_from_monster_relation(effect_kind, effect_kind_rel) data = {} data["monsters"] = move_to if move_to == []: pass else: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if move_to is not None: self.move_to_monster(move_to, effect_kind) if monster_effect.if_not_to_2 is False or move_to: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2: return monster_effect.monster_effect_next2 else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 7: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.move_phase() if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 37: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind return self.copy_effect(monster_effect_unwrap, effect_kind) elif monster_effect_unwrap.monster_effect_val == 46: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind return self.copy_effect2(monster_effect_unwrap, effect_kind) elif monster_effect_unwrap.monster_effect_val == 8: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.change_turn(monster_effect_unwrap) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 35: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind data_tmp = self.copy_monster( monster_effect_unwrap.monster_effect, monster_effect_unwrap.monster_condition, effect_kind, ) self.get_effect(monster_effect, user,data_tmp) log_tmp = self.write_log(monster_effect.log, user, data_tmp) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 72: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind move_to = self.create_token(monster_effect_unwrap.monster_effect,user) if move_to is not None: self.move_to_monster(move_to, effect_kind) data = {} data["monsters"] = move_to self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.if_not_to_2 is False or move_to: if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) else: if monster_effect.pac2: return self._pac(monster_effect.pac2) else: if monster_effect.monster_effect_next2: return monster_effect.monster_effect_next2 else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 71: effect_kind = self.get_pac_effect_kind() if effect_kind is None: effect_kind = monster_effect.monster_effect_kind data_tmp = self.copy_monster_specify( monster_effect_unwrap.monster_effect, monster_effect_unwrap.monster_condition, effect_kind, ) self.get_effect(monster_effect, user,data_tmp) log_tmp = self.write_log(monster_effect.log, user, data_tmp) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 34: data_tmp = self.change_variable_by_monster() data = {} data["monsters"] = data_tmp[0] data["val"] = data_tmp[1] if data["val"] != 0: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 80: change_show = self.change_show(0,monster_effect_unwrap) data = {} self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 2: change_val = self.change_variable(0,monster_effect_unwrap) data = {} data["val"] = change_val if change_val != 0: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 49: change_val = self.change_alt_global() data = {} data["val"] = change_val if change_val != 0: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 9: effect_kind = monster_effect.monster_effect_kind data2 = self.change_monster_variable_eternal( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, monster_effect_unwrap.change_val_monster_flag, monster_effect_unwrap.accumulate_flag ) if data2 is not None: data = {} data["monsters"] = data2[0] data["val"] = data2[1] if data: self.get_effect(monster_effect, user,data) log_tmp = self.write_log(monster_effect.log, user, data) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 29: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.change_variable_multiple(0, None, monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 25: effect_kind = monster_effect.monster_effect_kind return_value = self.change_monster_relation( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, ) self.get_effect(monster_effect, user,return_value) log_tmp = self.write_log_change_monster_relation( monster_effect.log, return_value ) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 39: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind self.invalid_effect(effect_kind, monster_effect_unwrap.monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 70: # 対象クリア effect_kind = monster_effect.monster_effect_kind specify = self.change_monster_relation_clear( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, ) return_value = self.change_monster_relation_specify( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, specify ) self.get_effect(monster_effect, user,return_value) log_tmp = self.write_log_change_monster_relation( monster_effect.log, return_value ) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 38: # 対象クリア self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind self.change_monster_relation_clear( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, ) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 33: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp effect_kind = monster_effect.monster_effect_kind self.clear_relation( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, ) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 32: effect_kind = monster_effect.monster_effect_kind effect_kind_rel = monster_effect.monster_effect_kind_rel return_value = self.change_monster_variable_relation( monster_effect_unwrap.monster_effect, effect_kind, monster_effect_unwrap.monster_condition, effect_kind_rel, ) self.get_effect(monster_effect, user,return_value) log_tmp = self.write_log(monster_effect.log, user, return_value) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 10: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.shuffle() if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 11: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.clear() if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 12: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.raise_by_monster_effect() if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 13: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.change_appointment() if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 14: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp monster_effect_text = json.loads( monster_effect.monster_effect.monster_effect ) if "timing_fresh" in monster_effect_text: fresh= monster_effect_text["timing_fresh"] else: fresh= True self.change_timing(int(monster_effect_text["move_to_timing"]),fresh,int(monster_effect_text["t_num"])) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 19: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp if duel.timing3 is not None: self.expire_timing(duel.timing3,duel.timing3.next_timing, duel.user_turn) duel.timing3 = duel.timing3.next_timing elif duel.timing2 is not None: self.expire_timing(duel.timing2,duel.timing2.next_timing, duel.user_turn) duel.timing2 = duel.timing2.next_timing elif duel.timing is not None: self.expire_timing(duel.timing,duel.timing.next_timing, duel.user_turn) timing = duel.timing.next_timing duel.timing = timing if duel.timing is None and duel.timing2 is None and duel.timing3 is None: self.timing_mess = {} if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 18: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.move_effect_variable_to_timing(0) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 60: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.sound_effect_effect(monster_effect.monster_effect.monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 61: self.change_appoint(monster_effect.monster_effect.monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 21: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.play_music(monster_effect.monster_effect.monster_effect) if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 30: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.select_multiple() if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) elif monster_effect_unwrap.monster_effect_val == 31: self.get_effect(monster_effect, user) log_tmp = self.write_log(monster_effect.log, user) duel.log_turn += log_tmp duel.log += log_tmp self.current_log += log_tmp self.select_multiple_other() if monster_effect.pac: return self._pac(monster_effect.pac) else: if monster_effect.monster_effect_next: return monster_effect.monster_effect_next else: return self.pop_pac(user) def write_log_change_monster_relation(self, log, data): if self.duel.mute == 1: return if log == "": return "" relate_monster = data["relate_monster"] related_monster = data["related_monster"] result_log = "" if not log.find("@") : relate_monster = [] relate_monster.append("dummy") for i in range(len(relate_monster)): log_text = log while 1: log_calc = re.search("\(.*?\)", log_text) if log_calc is None: break dummy = log_calc.group() dummy = dummy[1:-1] tmp_log = "" if dummy == "@": if len(relate_monster) > i: tmp_log = relate_monster[i]["monster_name"] else: tmp_log = "" elif dummy == "*": if len(related_monster) > i: tmp_log = related_monster[i]["monster_name"] else: tmp_log = "" log_text = log_text.replace(log_calc.group(), tmp_log) result_log += log_text + "\n" return result_log def write_prompt(self,prompt,user): duel = self.duel prompt_text = prompt while 1: log_calc = re.search("\(.*?\)", prompt_text) if log_calc is None: break dummy = log_calc.group() dummy = dummy[1:-1] if(dummy == "@"): break if(dummy[0] == "{"): tmp = self.get_name_all(dummy, 1) if len(tmp): tmp = tmp[0] else: tmp = "" elif dummy[0] == "$": tmp = self.get_place_name(dummy,user) prompt_text = prompt_text.replace(log_calc.group(), tmp) + "\n" return prompt_text def get_effect(self,monster_effect,user,data=None): flag = False if data is None or "monsters" not in data: if monster_effect.effect != "": effect_ary = monster_effect.effect.split("|") for effect in effect_ary: effect2 = effect.split(";") if effect2[0] == "video" or effect2[0] == "background": if(flag is False): self.effect += "&"+str(self.duel.effect_flag)+"*" self.effect2 += "&"+str(self.duel.effect_flag)+"*" if effect2[0] == "background": self.duel.background_image = effect2[1] self.effect += monster_effect.effect + "|" self.effect2 += monster_effect.effect + "|" flag = True else: pass return; else: if monster_effect.effect != "": effect_ary = monster_effect.effect.split("|") for effect in effect_ary: monster_i = 0; effect2 = effect.split(";") if effect2[0] == "video" or effect2[0] == "background": if effect2[0] == "background": if(flag is False): self.effect += "&"+str(self.duel.effect_flag)+"*" self.effect2 += "&"+str(self.duel.effect_flag)+"*" self.duel.background_image = effect2[1] self.effect += monster_effect.effect + "|" self.effect2 += monster_effect.effect + "|" flag = True if(effect2[1] != "number"): if(flag is False): if self.effect[0] != "&": self.effect = "&"+str(self.duel.effect_flag)+"*"+self.effect self.effect2 = "&"+str(self.duel.effect_flag)+"*"+self.effect self.duel.effect_flag +=1 else: self.effect += "&"+str(self.duel.effect_flag)+"*" self.effect2 += "&"+str(self.duel.effect_flag)+"*" self.duel.effect_flag +=1 self.effect += effect + "|" self.effect2 += effect + "|" flag = True elif effect2[0] == "monster": for monster in data["monsters"]: if monster["deck_id"] != 0: monster_i += 1 continue x = str(monster["x"]) y = str(monster["y"]) if(effect2[1] != "number"): if(flag is False): if self.effect[0] != "&": self.effect = "&"+str(self.duel.effect_flag)+"*"+self.effect self.effect2 = "&"+str(self.duel.effect_flag)+"*"+self.effect self.duel.effect_flag +=1 else: self.effect += "&"+str(self.duel.effect_flag)+"*" self.effect2 += "&"+str(self.duel.effect_flag)+"*" self.duel.effect_flag +=1 self.effect += "monster;"+x+";"+y+";"+effect2[1]+"|" self.effect2 += "monster;"+x+";"+y+";"+effect2[1]+"|" flag = True else: if isinstance(data["val"], list): if(flag is False): if self.effect[0] != "&": self.effect = "&"+str(self.duel.effect_flag)+"*"+self.effect self.effect2 = "&"+str(self.duel.effect_flag)+"*"+self.effect self.duel.effect_flag +=1 else: self.effect += "&"+str(self.duel.effect_flag)+"*" self.effect2 += "&"+str(self.duel.effect_flag)+"*" self.duel.effect_flag +=1 self.effect += "monster;"+x+";"+y+";"+effect2[1]+";"+str(abs(int(float(data["val"][monster_i]))))+"|" self.effect2 += "monster;"+x+";"+y+";"+effect2[1]+";"+str(abs(int(float(data["val"][monster_i]))))+"|" else: if(flag is False): if self.effect[0] != "&": self.effect = "&"+str(self.duel.effect_flag)+"*"+self.effect self.effect2 = "&"+str(self.duel.effect_flag)+"*"+self.effect self.duel.effect_flag +=1 else: self.effect += "&"+str(self.duel.effect_flag)+"*" self.effect2 += "&"+str(self.duel.effect_flag)+"*" self.duel.effect_flag +=1 self.effect += "monster;"+x+";"+y+";"+effect2[1]+";"+str(abs(int(float(data["val"]))))+"|" self.effect2 += "monster;"+x+";"+y+";"+effect2[1]+";"+str(abs(int(float(data["val"]))))+"|" flag = True monster_i += 1 return; def write_log(self, log, user, data=None): duel = self.duel if self.duel.guest_flag is False: user1_name = duel.user_1.first_name else: user1_name = duel.guest_name if self.duel.is_ai is False: if self.duel.guest_flag2 is False: user2_name = duel.user_2.first_name else: user2_name = duel.guest_name2 else: user2_name = "NPC" result_log = "" if log == "": return "" if log.find("@") == -1 and log.find("#") == -1: if log.find("(^)") != -1: tmp_log = len(data["monsters"]) log = log.replace("(^)", str(tmp_log)) if data is not None and "monsters" in data: del data["monsters"] if data is None or "monsters" not in data: log_text = log i = 0 while 1: log_calc = re.search("\(.*?\)", log_text) if log_calc is None: break dummy = log_calc.group() dummy = dummy[1:-1] if dummy == "#": tmp_log = "" elif dummy[0] == "$": tmp_log = self.get_place_name(dummy,user) elif dummy == "@": tmp_log = data["monsters"][i]["det"]["monster_name"] elif dummy == "%": if isinstance(data["val"], list): tmp_log = str(int(-float(data["val"][i]))) else: tmp_log = str(int(-float(data["val"]))) elif dummy == "*": if isinstance(data["val"], list): tmp_log = str(int(float(data["val"][i]))) else: tmp_log = str(int(float(data["val"]))) elif dummy == "&": if i >= len(data["monsters2"]): return "" tmp_log = data["monsters2"][i]["det"]["monster_name"] elif dummy[0] != "/": tmp = self.get_name_all(dummy, 1) tmp_log = tmp[0] elif dummy[1] == "1": if user == 1: tmp_log = user1_name else: tmp_log = user2_name elif dummy[1] == "2": if user == 1: tmp_log = user2_name else: tmp_log = user1_name elif dummy[1] == "$": tmp_log = self.get_place_name(dummy,user) log_text = log_text.replace(log_calc.group(), tmp_log) + "\n" i += 1 return html.escape(log_text) for i in range(len(data["monsters"])): log_text = log while 1: log_calc = re.search("\(.*?\)", log_text) if log_calc is None: break dummy = log_calc.group() dummy = dummy[1:-1] if dummy == "#": tmp_log = "" elif dummy[0] == "$": tmp_log = self.get_place_name(dummy,user) elif dummy == "^": tmp_log = len(data["monsters"][i]) elif dummy == "@": tmp_log = data["monsters"][i]["det"]["monster_name"] elif dummy == "%": if isinstance(data["val"], list): tmp_log = str(-int(float(data["val"][i]))) else: tmp_log = str(-int(float(data["val"]))) elif dummy == "*": if isinstance(data["val"], list): tmp_log = str(int(float(data["val"][i]))) else: tmp_log = str(int(float(data["val"]))) elif dummy == "&": tmp_log = data["monsters2"][i]["det"]["monster_name"] elif dummy[0] != "/": tmp = self.get_name_all(dummy, 1) tmp_log = tmp[0] elif dummy[1] == "1": if user == 1: tmp_log = user1_name else: tmp_log = user2_name elif dummy[1] == "2": if user == 1: tmp_log = user2_name else: tmp_log = user1_name elif dummy[1] == "$": tmp_log = self.get_place_name(dummy,user) log_text = log_text.replace(log_calc.group(), tmp_log) result_log += log_text + "\n" return html.escape(result_log) def raise_by_monster_effect(self): duel = self.duel chain_det = json.loads(self.duel.chain_det) chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] monster_effect_wrapper = MonsterEffectWrapper.objects.get( id=int(chain_det[str(duel.chain - 1)]) ) monster_effect = monster_effect_wrapper.monster_effect monster_effect_text = json.loads(monster_effect.monster_effect) trigger_waitings = json.loads(duel.trigger_waiting) for monster_effect_det in monster_effect_text: trigger = Trigger.objects.get(id=monster_effect_det["trigger"]["0"]) tmp = {} tmp["monster"] = "" tmp["move_from"] = None tmp["trigger"] = monster_effect_det["trigger"]["0"] tmp["priority"] = trigger.priority tmp["storategy_priority"] = trigger.storategy_priority tmp["mine_or_other"] = 1 tmp["user"] = effect_user tmp["place"] = "" tmp["deck_id"] = "" tmp["place_from"] = "" tmp["deck_id_from"] = "" tmp["x"] = 0 tmp["y"] = 0 tmp["from_x"] = 0 tmp["from_y"] = 0 tmp["strategy_value"] = 0 trigger_waitings.append(tmp) duel.trigger_waiting = json.dumps(trigger_waitings) def expire_chain(self): self.expire_deck_chain() self.expire_grave_chain() self.expire_hand_chain() self.expire_field_chain() def expire_turn(self, turn): self.expire_deck_turn(turn) self.expire_grave_turn(turn) self.expire_hand_turn(turn) self.expire_field_turn(turn) def expire_field_chain(self): field = self.field field_size = FieldSize.objects.get(id=1) if self.field_free is False: field_x = field_size.field_x else: field_x = 20 for x in range(field_x): for y in range(field_size.field_y): if field[x][y]["det"] is None: continue if "eternal" not in field[x][y]["det"]: continue index = 0 index_list = [] for eternal in field[x][y]["det"]["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 continue index_list.append(index) index += 1 for index3 in reversed(index_list): del field[x][y]["det"]["eternal"][index3] self.field = field def expire_field_turn(self, turn): field = self.field field_size = FieldSize.objects.get(id=1) if self.field_free is False: field_x = field_size.field_x else: field_x = 20 for x in range(field_x): for y in range(field_size.field_y): if field[x][y]["det"] is None: continue if "eternal" not in field[x][y]["det"]: continue index = 0 index_list = [] for eternal in field[x][y]["det"]["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if ( life == 3 or (((field[x][y]["mine_or_other"] == 1 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 2)) and life == 1) or (((field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 1and self.duel.user_turn == 2)) and life == 2) ): field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] <= 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del field[x][y]["det"]["eternal"][index3] self.field = field def expire_hand_turn(self, turn): hands = self.hand_structure i = 0 for hand in hands: i += 1 if hand.mine_or_other == 0: myhands = self.hands[i]["myhand"] otherhands = self.hands[i]["otherhand"] index2 = -1 for myhand in myhands: index2 += 1 if "eternal" not in myhand: continue index = 0 index_list = [] for eternal in myhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): myhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( myhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del myhand["eternal"][index3] myhands[index2] = myhand index2 = -1 for otherhand in otherhands: index2 += 1 if "eternal" not in otherhand: continue index = 0 index_list = [] for eternal in otherhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): otherhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( otherhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del otherhand["eternal"][index3] otherhands[index2] = otherhand self.hands[i]["myhand"] = myhands self.hands[i]["otherhand"] = otherhands else: commonhands = self.hands[i]["commonhand"] for commonhand in commonhands: index2 += 1 if "eternal" not in commonhand: continue index = 0 index_list = [] for eternal in commonhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if life == 3: commonhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commonhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commonhand["eternal"][index3] commonhands[index2] = commonhand self.hands[i]["commonhand"] = commonhands def expire_grave_turn(self, turn): graves = self.grave_structure i = 0 for grave in graves: i += 1 if grave.mine_or_other == 0: mygraves = self.graves[i]["mygrave"] othergraves = self.graves[i]["othergrave"] index2 = -1 for mygrave in mygraves: index2 += 1 if "eternal" not in mygrave: continue index = 0 index_list = [] for eternal in mygrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): mygrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( mygrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del mygrave["eternal"][index3] mygraves[index2] = mygrave index2 = -1 for othergrave in othergraves: index2 += 1 if "eternal" not in othergrave: continue index = 0 index_list = [] for eternal in othergrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): othergrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( othergrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del othergrave["eternal"][index3] othergraves[index2] = othergrave self.graves[i]["mygrave"] = mygraves self.graves[i]["othergrave"] = othergraves else: commongraves = self.graves[i]["commongrave"] for commongrave in commongraves: index2 += 1 if "eternal" not in commongrave: continue index = 0 index_list = [] for eternal in commongrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if life == 3: commongrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commongrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commongrave["eternal"][index3] commongraves[index2] = commongrave self.graves[i]["commongrave"] = commongraves def expire_hand_chain(self): hands = self.hand_structure i = 0 for hand in hands: i += 1 if hand.mine_or_other == 0: myhands = self.hands[i]["myhand"] otherhands = self.hands[i]["otherhand"] index2 = -1 for myhand in myhands: index2 += 1 if "eternal" not in myhand: continue index = 0 index_list = [] for eternal in myhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 index_list.append(index) index2 = -1 for otherhand in otherhands: index2 += 1 if "eternal" not in otherhand: continue index = 0 index_list = [] for eternal in otherhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 continue index_list.append(index) index += 1 for index3 in reversed(index_list): del otherhand["eternal"][index3] otherhands[index2] = otherhand self.hands[i]["myhand"] = myhands self.hands[i]["otherhand"] = otherhands else: commonhands = self.hands[i]["commonhand"] index2 = -1 for commonhand in commonhands: index2 += 1 if "eternal" not in commonhand: continue index = 0 index_list = [] for eternal in commonhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 continue index_list.append(index) index += 1 for index3 in reversed(index_list): del commonhand["eternal"][index3] commonhands[index2] = commonhand self.hands[i]["commonhand"] = commonhands def expire_grave_chain(self): graves = self.grave_structure i = 0 for grave in graves: i += 1 if grave.mine_or_other == 0: mygraves = self.graves[i]["mygrave"] othergraves = self.graves[i]["othergrave"] index2 = -1 for mygrave in mygraves: index2 += 1 if "eternal" not in mygrave: continue index = 0 index_list = [] for eternal in mygrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 index_list.append(index) index2 = -1 for othergrave in othergraves: index2 += 1 if "eternal" not in othergrave: continue index = 0 index_list = [] for eternal in othergrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 continue index_list.append(index) index += 1 for index3 in reversed(index_list): del othergrave["eternal"][index3] othergraves[index2] = othergrave self.graves[i]["mygrave"] = mygraves self.graves[i]["othergrave"] = othergraves else: index2 = -1 commongraves = self.graves[i]["commongrave"] for commongrave in commongraves: index2 += 1 if "eternal" not in commongrave: continue index = 0 index_list = [] for eternal in commongrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 continue index_list.append(index) index += 1 for index3 in reversed(index_list): del commongrave["eternal"][index3] commongraves[index2] = commongrave self.graves[i]["commongrave"] = commongraves def expire_deck_chain(self): decks = self.deck_structure i = 0 for deck in decks: i += 1 if deck.mine_or_other == 0: mydecks = self.decks[i]["mydeck"] otherdecks = self.decks[i]["otherdeck"] index2 = -1 for mydeck in mydecks: index2 += 1 if "eternal" not in mydeck: continue index = 0 index_list = [] for eternal in mydeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 index_list.append(index) index2 = -1 for otherdeck in otherdecks: index2 += 1 if "eternal" not in otherdeck: continue index = 0 index_list = [] for eternal in otherdeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 continue index_list.append(index) index += 1 for index3 in reversed(index_list): del otherdeck["eternal"][index3] otherdecks[index2] = otherdeck self.decks[i]["mydeck"] = mydecks self.decks[i]["otherdeck"] = otherdecks else: index2 = -1 commondecks = self.decks[i]["commondeck"] for commondeck in commondecks: index2 += 1 if "eternal" not in commondeck: continue index = 0 index_list = [] for eternal in commondeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "chain": index += 1 continue index_list.append(index) index += 1 for index3 in reversed(index_list): del commondeck["eternal"][index3] commondecks[index2] = commondeck self.decks[i]["commondeck"] = commondecks def expire_deck_turn(self, turn): decks = self.deck_structure i = 0 for deck in decks: i += 1 if deck.mine_or_other == 0: mydecks = self.decks[i]["mydeck"] otherdecks = self.decks[i]["otherdeck"] index2 = -1 for mydeck in mydecks: index2 += 1 if "eternal" not in mydeck: continue index = 0 index_list = [] for eternal in mydeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): mydeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( mydeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del mydeck["eternal"][index3] mydecks[index2] = mydeck index2 = -1 for otherdeck in otherdecks: index2 += 1 if "eternal" not in otherdeck: continue index = 0 index_list = [] for eternal in otherdeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): otherdeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( otherdeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del otherdeck["eternal"][index3] otherdecks[index2] = otherdeck self.decks[i]["mydeck"] = mydecks self.decks[i]["otherdeck"] = otherdecks else: commondecks = self.decks[i]["commondeck"] index2 = -1 for commondeck in commondecks: index2 += 1 if "eternal" not in commondeck: continue index = 0 index_list = [] for eternal in commondeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "turn": index += 1 continue life = int(life[1]) if life == 3: commondeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commondeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commondeck["eternal"][index3] commondecks[index2] = commondeck self.decks[i]["commondeck"] = commondecks def expire_timing(self, timing,next_timing, turn): self.expire_deck_timing(timing,next_timing, turn) self.expire_grave_timing(timing,next_timing, turn) self.expire_hand_timing(timing,next_timing, turn) self.expire_field_timing(timing,next_timing, turn) def expire_field_timing(self, timing,next_timing, turn): field = self.field field_size = FieldSize.objects.get(id=1) if self.field_free is False: field_x = field_size.field_x else: field_x = 20 for x in range(field_x): for y in range(field_size.field_y): if field[x][y]["det"] is None: continue if "eternal" not in field[x][y]["det"]: continue index = 0 index_list = [] for eternal in field[x][y]["det"]["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if ( life == 3 or (((field[x][y]["mine_or_other"] == 1 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 2)) and life == 1) or (((field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 1and self.duel.user_turn == 2)) and life == 2) ): field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] <= 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del field[x][y]["det"]["eternal"][index3] index = 0 index_list = [] for eternal in field[x][y]["det"]["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timingbegin": index += 1 continue if int(life[2]) != next_timing.id: index += 1 continue life = int(life[1]) if ( life == 3 or (((field[x][y]["mine_or_other"] == 1 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 2)) and life == 1) or (((field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 1and self.duel.user_turn == 2)) and life == 2) ): field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] <= 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del field[x][y]["det"]["eternal"][index3] self.field = field def expire_hand_timing(self, timing,next_timing, turn): hands = self.hand_structure i = 0 for hand in hands: i += 1 if hand.mine_or_other == 0: myhands = self.hands[i]["myhand"] otherhands = self.hands[i]["otherhand"] index2 = -1 for myhand in myhands: index2 += 1 if "eternal" not in myhand: continue index = 0 index_list = [] for eternal in myhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): myhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( myhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del myhand["eternal"][index3] myhands[index2] = myhand index2 = -1 for myhand in myhands: index2 += 1 if "eternal" not in myhand: continue index = 0 index_list = [] for eternal in myhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timingbegin": index += 1 continue if int(life[2]) != next_timing.id: continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): myhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( myhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del myhand["eternal"][index3] myhands[index2] = myhand index2 = -1 for otherhand in otherhands: index2 += 1 if "eternal" not in otherhand: continue index = 0 index_list = [] for eternal in otherhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): otherhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( otherhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del otherhand["eternal"][index3] otherhands[index2] = otherhand self.hands[i]["myhand"] = myhands self.hands[i]["otherhand"] = otherhands else: commonhands = self.hands[i]["commonhand"] index2 = -1 for commonhand in commonhands: index2 += 1 if "eternal" not in commonhand: continue index = 0 index_list = [] for eternal in commonhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if life == 3: commonhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commonhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commonhand["eternal"][index3] commonhands[index2] = commonhand index2 = -1 for commonhand in commonhands: index2 += 1 if "eternal" not in commonhand: continue index = 0 index_list = [] for eternal in commonhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if life == 3: commonhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commonhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commonhand["eternal"][index3] commonhands[index2] = commonhand self.hands[i]["commonhand"] = commonhands def expire_grave_timing(self, timing,next_timing, turn): graves = self.grave_structure i = 0 for grave in graves: i += 1 if grave.mine_or_other == 0: mygraves = self.graves[i]["mygrave"] othergraves = self.graves[i]["othergrave"] index2 = -1 for mygrave in mygraves: index2 += 1 if "eternal" not in mygrave: continue index = 0 index_list = [] for eternal in mygrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): mygrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( mygrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del mygrave["eternal"][index3] mygraves[index2] = mygrave index2 = -1 for othergrave in othergraves: index2 += 1 if "eternal" not in othergrave: continue index = 0 index_list = [] for eternal in othergrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if self.user == 1: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): othergrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( othergrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del othergrave["eternal"][index3] othergraves[index2] = othergrave self.graves[i]["mygrave"] = mygraves self.graves[i]["othergrave"] = othergraves else: commongraves = self.graves[i]["commongrave"] for commongrave in commongraves: index2 += 1 if "eternal" not in commongrave: continue index = 0 index_list = [] for eternal in commongrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if life == 3: commongrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commongrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commongrave["eternal"][index3] commongraves[index2] = commongrave self.graves[i]["commongrave"] = commongraves def expire_deck_timing(self, timing,next_timing, turn): decks = self.deck_structure i = 0 for deck in decks: i += 1 if deck.mine_or_other == 0: mydecks = self.decks[i]["mydeck"] otherdecks = self.decks[i]["otherdeck"] index2 = -1 for mydeck in mydecks: index2 += 1 if "eternal" not in mydeck: continue index = 0 index_list = [] for eternal in mydeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): mydeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( mydeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del mydeck["eternal"][index3] mydecks[index2] = mydeck index2 = -1 for otherdeck in otherdecks: index2 += 1 if "eternal" not in otherdeck: continue index = 0 index_list = [] for eternal in otherdeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): otherdeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( otherdeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del otherdeck["eternal"][index3] otherdecks[index2] = otherdeck self.decks[i]["mydeck"] = mydecks self.decks[i]["otherdeck"] = otherdecks else: index2 = -1 commondecks = self.decks[i]["commondeck"] for commondeck in commondecks: index2 += 1 if "eternal" not in commondeck: continue index = 0 index_list = [] for eternal in commondeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timing": index += 1 continue if int(life[2]) != timing.id: index += 1 continue life = int(life[1]) if life == 3: commondeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commondeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commondeck["eternal"][index3] commondecks[index2] = commondeck for commondeck in commondecks: index2 += 1 if "eternal" not in commondeck: continue index = 0 index_list = [] for eternal in commondeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "timingbegin": index += 1 continue if int(life[2]) != next_timing.id: index += 1 continue life = int(life[1]) if life == 3: commondeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commondeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commondeck["eternal"][index3] commondecks[index2] = commondeck self.decks[i]["commondeck"] = commondecks def expire_phase(self, phase, org_phase,turn): self.expire_deck_phase(phase,org_phase, turn) self.expire_grave_phase(phase,org_phase, turn) self.expire_hand_phase(phase,org_phase, turn) self.expire_field_phase(phase,org_phase, turn) def expire_field_phase(self, phase,org, turn): field = self.field field_size = FieldSize.objects.get(id=1) if self.field_free is False: field_x = field_size.field_x else: field_x = 20 for x in range(field_x): for y in range(field_size.field_y): if field[x][y]["det"] is None: continue if "eternal" not in field[x][y]["det"]: continue index = 0 index_list = [] for eternal in field[x][y]["det"]["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if ( life == 3 or (((field[x][y]["mine_or_other"] == 1 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 2) ) and life == 1) or (((field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 1) ) and life == 2) ): field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] <= 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del field[x][y]["det"]["eternal"][index3] index = 0 index_list = [] for eternal in field[x][y]["det"]["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phaseend": index += 1 continue if int(life[2]) != org.id: index += 1 continue life = int(life[1]) if ( life == 3 or (((field[x][y]["mine_or_other"] == 1 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 2) ) and life == 1) or (((field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 1) or (field[x][y]["mine_or_other"] == 2 and self.duel.user_turn == 1) ) and life == 2) ): field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( field[x][y]["det"]["eternal"][index][ "monster_variable_change_life_length" ] <= 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del field[x][y]["det"]["eternal"][index3] self.field = field def expire_hand_phase(self, phase,org, turn): hands = self.hand_structure i = 0 for hand in hands: i += 1 if hand.mine_or_other == 0: myhands = self.hands[i]["myhand"] otherhands = self.hands[i]["otherhand"] index2 = -1 for myhand in myhands: index2 += 1 if "eternal" not in myhand: continue index = 0 index_list = [] for eternal in myhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): myhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( myhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del myhand["eternal"][index3] myhands[index2] = myhand index2 = -1 for otherhand in otherhands: index2 += 1 if "eternal" not in otherhand: continue index = 0 index_list = [] for eternal in otherhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phaseend": index += 1 continue if int(life[2]) != org.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): otherhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( otherhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del otherhand["eternal"][index3] otherhands[index2] = otherhand self.hands[i]["myhand"] = myhands self.hands[i]["otherhand"] = otherhands else: commonhands = self.hands[i]["commonhand"] inde2 = -1 for commonhand in commonhands: index2 += 1 if "eternal" not in commonhand: continue index = 0 index_list = [] for eternal in commonhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 else: life = 1 if life == 3: commonhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commonhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commonhand["eternal"][index3] commonhands[index2] = commonhand inde2 = -1 for commonhand in commonhands: index2 += 1 if "eternal" not in commonhand: continue index = 0 index_list = [] for eternal in commonhand["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phaseend": index += 1 continue if int(life[2]) != org.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 else: life = 1 if life == 3: commonhand["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commonhand["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commonhand["eternal"][index3] commonhands[index2] = commonhand self.hands[i]["commonhand"] = commonhands def expire_grave_phase(self, phase, org,turn): graves = self.grave_structure i = 0 for grave in graves: i += 1 if grave.mine_or_other == 0: mygraves = self.graves[i]["mygrave"] othergraves = self.graves[i]["othergrave"] index2 = -1 for mygrave in mygraves: index2 += 1 if "eternal" not in mygrave: continue index = 0 index_list = [] for eternal in mygrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): mygrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( mygrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del mygrave["eternal"][index3] mygraves[index2] = mygrave index2 = -1 for othergrave in othergraves: index2 += 1 if "eternal" not in othergrave: continue index = 0 index_list = [] for eternal in othergrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.user == 2) or (life == 2 and self.user == 1) ): othergrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( othergrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del othergrave["eternal"][index3] othergraves[index2] = othergrave self.graves[i]["mygrave"] = mygraves self.graves[i]["othergrave"] = othergraves else: commongraves = self.graves[i]["commongrave"] index2 = -1 for commongrave in commongraves: index2 += 1 if "eternal" not in commongrave: continue index = 0 index_list = [] for eternal in commongrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if life == 3: commongrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commongrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commongrave["eternal"][index3] commongraves[index2] = commongrave index2 = -1 for commongrave in commongraves: index2 += 1 if "eternal" not in commongrave: continue index = 0 index_list = [] for eternal in commongrave["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phaseend": index += 1 continue if int(life[2]) != org.id: index += 1 continue life = int(life[1]) if life == 3: commongrave["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commongrave["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del commongrave["eternal"][index3] commongraves[index2] = commongrave self.graves[i]["commongrave"] = commongraves def expire_deck_phase(self, phase,org, turn): decks = self.deck_structure i = 0 for deck in decks: i += 1 if deck.mine_or_other == 0: mydecks = self.decks[i]["mydeck"] otherdecks = self.decks[i]["otherdeck"] index2 = -1 for mydeck in mydecks: index2 += 1 if "eternal" not in mydeck: continue index = 0 index_list = [] for eternal in mydeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 1) or (life == 2 and self.duel.user_turn == 2) ): mydeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( mydeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del mydeck["eternal"][index3] mydecks[index2] = mydeck index2 = -1 for otherdeck in otherdecks: index_list = [] index2 += 1 if "eternal" not in otherdeck: continue index = 0 index_list = [] for eternal in otherdeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if self.user == 1 and self.duel.user_turn == 1 or self.user == 2 and self.duel.user_turn == 2: pass else: if life == 1: life = 2 elif life == 2: life = 1 if ( life == 3 or (life == 1 and self.duel.user_turn == 2) or (life == 2 and self.duel.user_turn == 1) ): otherdeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( otherdeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in reversed(index_list): del otherdeck["eternal"][index3] otherdecks[index2] = otherdeck index2 = -1 self.decks[i]["mydeck"] = mydecks self.decks[i]["otherdeck"] = otherdecks else: index2 = -1 commondecks = self.decks[i]["commondeck"] for commondeck in commondecks: index2 += 1 if "eternal" not in commondeck: continue index = 0 index_list = [] for eternal in commondeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phase": index += 1 continue if int(life[2]) != phase.id: index += 1 continue life = int(life[1]) if life == 3: commondeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commondeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in index_list.reverse(): del commondeck["eternal"][index3] commondecks[index2] = commondeck index2 = -1 for commondeck in commondecks: index2 += 1 if "eternal" not in commondeck: continue index = 0 index_list = [] for eternal in commondeck["eternal"]: if eternal is None: index += 1 continue life = eternal["monster_variable_change_life"].split("_") if life[0] != "phaseend": index += 1 continue if int(life[2]) != org.id: index += 1 continue life = int(life[1]) if life == 3: commondeck["eternal"][index][ "monster_variable_change_life_length" ] -= 1 if ( commondeck["eternal"][index][ "monster_variable_change_life_length" ] == 0 ): index_list.append(index) index += 1 for index3 in index_list.reverse(): del commondeck["eternal"][index3] commondecks[index2] = commondeck self.decks[i]["commondeck"] = commondecks def move_phase(self): duel = self.duel chain_det = json.loads(self.duel.chain_det) monster_effect_wrapper = MonsterEffectWrapper.objects.get( id=int(chain_det[str(duel.chain - 1)]) ) monster_effect = monster_effect_wrapper.monster_effect monster_effect_text = json.loads(monster_effect.monster_effect) org_phase = duel.phase duel.phase = Phase.objects.get(id=int(monster_effect_text["move_to_phase"])) duel.current_priority = 10000 self.expire_phase(duel.phase, org_phase,duel.user_turn) def move_effect_variable_to_timing(self, cost=0): duel = self.duel cost = self.cost cost = cost[str(int(duel.chain - 1))] tmp = self.mess tmp = tmp[str(int(duel.chain - 1))] chain_det = json.loads(self.duel.chain_det) tmp2 = self.timing_mess monster_effect_wrapper = MonsterEffectWrapper.objects.get( id=int(chain_det[str(duel.chain - 1)]) ) monster_effect = monster_effect_wrapper.monster_effect monster_effect_text = json.loads(monster_effect.monster_effect) from_val_name = monster_effect_text["org_val"] from_val_names = from_val_name.split(",") to_val_name = monster_effect_text["val"] to_val_names = to_val_name.split(",") i = 0 for from_val_name in from_val_names: if from_val_name[0] != "~": if from_val_name not in tmp: return org_val = tmp[from_val_name] else: if from_val_name not in cost: return org_val = cost[from_val_name] tmp2[to_val_names[i]] = org_val i += 1 self.timing_mess = tmp2 def change_once_per_turn(self): if self.duel.once_per_turn1 != "": self.duel.once_per_turn1 += "_"+self.duel.tmponce_per_turn1 else: self.duel.once_per_turn1 = self.duel.tmponce_per_turn1 if self.duel.once_per_turn_group1 != "": self.duel.once_per_turn_group1 += "_"+self.duel.tmponce_per_turn_group1 else: self.duel.once_per_turn_group1 = self.duel.tmponce_per_turn_group1 if self.duel.once_per_turn_group2 != "": self.duel.once_per_turn_group2 += "_"+self.duel.tmponce_per_turn_group2 else: self.duel.once_per_turn_group2 = self.duel.tmponce_per_turn_group2 if self.duel.once_per_turn2 != "": self.duel.once_per_turn2 += "_"+self.duel.tmponce_per_turn2 else: self.duel.once_per_turn2 = self.duel.tmponce_per_turn2 if self.duel.once_per_turn_monster_group1 != "": self.duel.once_per_turn_monster_group1 += "_"+self.duel.tmponce_per_turn_monster_group1 else: self.duel.once_per_turn_monster_group1 = self.duel.tmponce_per_turn_monster_group1 if self.duel.once_per_turn_monster_group2 != "": self.duel.once_per_turn_monster_group2 += "_"+self.duel.tmponce_per_turn_monster_group2 else: self.duel.once_per_turn_monster_group2 = self.duel.tmponce_per_turn_monster_group2 if self.duel.once_per_turn_monster1 != "": self.duel.once_per_turn_monster1 += "_"+self.duel.tmponce_per_turn_monster1 else: self.duel.once_per_turn_monster1 = self.duel.tmponce_per_turn_monster1 if self.duel.once_per_turn_monster2 != "": self.duel.once_per_turn_monster2 += "_"+self.duel.tmponce_per_turn_monster2 else: self.duel.once_per_turn_monster2 = self.duel.tmponce_per_turn_monster2 if self.duel.once_per_turn_exist1 != "": self.duel.once_per_turn_exist1 += "_"+self.duel.tmponce_per_turn_exist1 else: self.duel.once_per_turn_exist1 = self.duel.tmponce_per_turn_exist1 if self.duel.once_per_turn_exist2 != "": self.duel.once_per_turn_exist2 += "_"+self.duel.tmponce_per_turn_exist2 else: self.duel.once_per_turn_exist2 = self.duel.tmponce_per_turn_exist2 if self.duel.once_per_turn_relate1 != "": self.duel.once_per_turn_relate1 += "_"+self.duel.tmponce_per_turn_relate1 else: self.duel.once_per_turn_relate1 = self.duel.tmponce_per_turn_relate1 if self.duel.once_per_turn_relate2 != "": self.duel.once_per_turn_relate2 += "_"+self.duel.tmponce_per_turn_relate2 else: self.duel.once_per_turn_relate2 = self.duel.tmponce_per_turn_relate2 self.duel.tmponce_per_turn1 = "" self.duel.tmponce_per_turn_group1 = "" self.duel.tmponce_per_turn_group2 = "" self.duel.tmponce_per_turn_monster_group1 = "" self.duel.tmponce_per_turn_monster_group2 = "" self.duel.tmponce_per_turn2 = "" self.duel.tmponce_per_turn_monster1 = "" self.duel.tmponce_per_turn_monster2 = "" self.duel.tmponce_per_turn_exist1 = "" self.duel.tmponce_per_turn_exist2 = "" self.duel.tmponce_per_turn_relate1 = "" self.duel.tmponce_per_turn_relate2 = "" def change_turn(self, monster_effect): duel = self.duel self.turn_changed = True duel.once_per_turn1 = "" duel.once_per_turn2 = "" duel.once_per_turn_group1 = "" duel.once_per_turn_group2 = "" duel.once_per_turn_monster_group1 = "" duel.once_per_turn_monster_group2 = "" duel.once_per_turn_monster1 = "" duel.once_per_turn_monster2 = "" duel.once_per_turn_exist1 = "" duel.once_per_turn_exist2 = "" duel.once_per_turn_relate1 = "" duel.once_per_turn_relate2 = "" duel.effect_flag = 0 if self.duel.guest_flag is False: user1_name = duel.user_1.first_name else: user1_name = duel.guest_name if self.duel.is_ai is False: if self.duel.guest_flag2 is False: user2_name = duel.user_2.first_name else: user2_name = duel.guest_name2 else: user2_name = "NPC" if duel.user_turn == 1: #duel.change_turn_flag = True duel.user_turn = 2 duel.log_turn = str(duel.turn_count) +"ターン:"+ user2_name + "のターン\n" duel.log += duel.log_turn self.current_log += duel.log_turn elif duel.user_turn == 2 : #duel.change_turn_flag = True duel.user_turn = 1 if duel.is_ai is False: duel.log_turn = str(duel.turn_count) +"ターン:" + user1_name + "のターン\n" duel.log += duel.log_turn else: duel.log += str(duel.turn_count) +"ターン:" + user1_name + "のターン\n" duel.log_turn += str(duel.turn_count) +"ターン:" + user1_name + "のターン\n" self.current_log += duel.log_turn duel.appoint = duel.user_turn self.expire_turn(duel.user_turn) if monster_effect.monster_effect != "": monster_effect_text = json.loads(monster_effect.monster_effect) if monster_effect_text["turn_count_change"] is True: duel.turn_count += 1 else: duel.turn_count += 1 def change_appointment(self): duel = self.duel if duel.appoint == 1: duel.appoint = 2 elif duel.appoint == 2: duel.appoint = 1 duel.change_appoint_flag = True def change_timing(self, timing_id,fresh=True,t_num= 1): duel = self.duel if timing_id != 0: next_timing = Timing.objects.get(id=timing_id) else: next_timing = None if int(t_num) == 1 : if duel.timing is not None: self.expire_timing(duel.timing,next_timing, duel.user_turn) if timing_id == 0: duel.timing = None else: duel.timing = next_timing elif int(t_num) == 2 : if duel.timing2 is not None: self.expire_timing(duel.timing2,next_timing, duel.user_turn) if timing_id == 0: duel.timing2 = None else: duel.timing2 = next_timing elif int(t_num) == 3 : if duel.timing3 is not None: self.expire_timing(duel.timing3,next_timing, duel.user_turn) if timing_id == 0: duel.timing3 = None else: duel.timing3 = next_timing duel.current_priority = 10000 duel.timing_fresh = fresh def change_variable_multiple_cost(self, cost_det): self.change_variable_multiple(1, None, cost_det) def change_variable_cost(self): return self.change_variable(1) def change_variable_multiple(self, cost=0, user=None, monster_effect_wrapper=None): duel = self.duel chain_user = json.loads(self.duel.chain_user) if cost == 0: if user is None: user = chain_user[str(duel.chain - 1)] effect_kind = monster_effect_wrapper.monster_effect_kind monster_effect = monster_effect_wrapper.monster_effect monster_effect_texts = json.loads(monster_effect.monster_effect) else: user = chain_user[str(self.tmp_chain)] cost_wrapper = monster_effect_wrapper cost = cost_wrapper.cost monster_effect_texts = json.loads(cost.cost) variable = json.loads(duel.global_variable) for monster_effect_text in monster_effect_texts: variable_id = monster_effect_text["variable_name"].split("_") mine_or_other = int(variable_id[2]) variable_id = variable_id[1] change_val = self.calculate_boland( monster_effect_text["variable_change_val"] ) if duel.alt_global != "": alt_val = self.change_alt_global2( variable_id, mine_or_other, monster_effect_text["variable_change_how"], effect_kind, change_val, ) change_val -= alt_val instead_val = self.check_variable_instead( variable_id, mine_or_other, change_val, 1, user, effect_kind ) change_val -= instead_val if mine_or_other == 0: if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["value"] = change_val elif (mine_or_other == 1 and user == 1) or ( mine_or_other == 2 and user == 2 ): if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["1_value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["1_value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["1_value"] = change_val elif (mine_or_other == 2 and user == 1) or ( mine_or_other == 1 and user == 2 ): if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["2_value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["2_value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["2_value"] = change_val duel.global_variable = json.dumps(variable) return change_val def change_variable_by_monster_cost(self): return self.change_variable_by_monster(1) def change_variable_by_monster(self, cost=0): exclude = "" duel = self.duel chain_det = json.loads(self.duel.chain_det) chain_user = json.loads(self.duel.chain_user) if cost == 0: chain_user = chain_user[str(duel.chain - 1)] monster_effect_wrapper = MonsterEffectWrapper.objects.get( id=int(chain_det[str(duel.chain - 1)]) ) monster_effect = monster_effect_wrapper.monster_effect monster_condition = monster_effect.monster_condition monster_effect_text = json.loads(monster_effect.monster_effect) effect_kind = monster_effect_wrapper.monster_effect_kind effect_kind_rel = monster_effect_wrapper.monster_effect_kind_rel accumulate_flag = monster_effect.accumulate_flag else: chain_user = chain_user[str(self.tmp_chain)] cost_det = duel.cost_det cost_wrapper = CostWrapper.objects.get(id=cost_det) cost = cost_wrapper.cost monster_condition = cost.cost_condition monster_effect_text = json.loads(cost.cost) effect_kind = cost_wrapper.cost_kind effect_kind_rel = cost_wrapper.cost_kind_rel accumulate_flag = False variable_id = monster_effect_text["variable_name"].split("_") mine_or_other = int(variable_id[2]) mine_or_other_val = int(variable_id[2]) variable_id = variable_id[1] variable = json.loads(duel.global_variable) monster_effect_monster = monster_effect_text["monster"] monsters = [] if monster_condition != "": monster_condition = json.loads(monster_condition) monster_condition = monster_condition["monster"][0]["monster"] # まずは対象のモンスターを洗い出す for monster_effect_det in monster_effect_monster: if "as_monster_condition" not in monster_effect_det: continue if monster_effect_det["as_monster_condition"] == "": continue as_monsters = monster_effect_det["as_monster_condition"] if not isinstance(as_monsters, list): tmp_monster = [] tmp_monster.append(as_monsters) as_monsters = tmp_monster for as_monster in as_monsters: if as_monster[0] == "~": tmp = self.cost if duel.in_cost is True: tmp = tmp[str(self.tmp_chain)] else: tmp = tmp[str(int(duel.chain - 1))] if as_monster in tmp: place1 = tmp[as_monster] else: place1 = [] elif as_monster[0] == "%": tmp = self.timing_mess if as_monster in tmp: place1 = tmp[as_monster] else: place1 = [] elif as_monster[0] == "-": tmp = self.mess tmp = tmp[str(int(duel.chain - 2))] if as_monster in tmp: place1 = tmp[as_monster] else: place1 = [] else: tmp = self.mess tmp = tmp[str(int(duel.chain - 1))] if as_monster in tmp: place1 = tmp[as_monster] else: place1 = [] for place2 in place1: place = place2["place"] if place == "field": x = int(place2["x"]) y = int(place2["y"]) field = self.field if "place_unique_id" in place2: place_unique_id = place2["place_unique_id"] if "det" not in field[x][y] or field[x][y]["det"] is None: continue if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue else: if field[x][y]["det"]["place_unique_id"] != place_unique_id: continue if self.check_not_effected( field[x][y]["det"], chain_user, effect_kind, "field", 0, x, y, field[x][y]["mine_or_other"], cost, ): continue tmp2 = {} tmp2["det"] = field[x][y]["det"] tmp2["mine_or_other"] = field[x][y]["mine_or_other"] tmp2["user"] = chain_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue monsters.append(tmp2) continue mine_or_other = int(place2["mine_or_other"]) deck_id = place2["deck_id"] place_unique_id = place2["place_unique_id"] if (self.user == 1 and mine_or_other == 1) or ( 2 == self.user and mine_or_other == 2 ): mine_or_other = 1 elif (self.user != 1 and mine_or_other == 1) or ( 1 == self.user and mine_or_other == 2 ): mine_or_other = 2 else: mine_or_other = 3 if place == "deck": if mine_or_other == 1: tmp = self.decks[deck_id]["mydeck"] elif mine_or_other == 2: tmp = self.decks[deck_id]["otherdeck"] else: tmp = self.decks[deck_id]["commondeck"] user_decks = tmp for index in range(len(user_decks)): if place_unique_id == user_decks[index]["place_unique_id"]: if not self.check_not_effected( user_decks[index], chain_user, effect_kind, "deck", deck_id, 0, 0, place2["mine_or_other"], cost, ): tmp2 = {} tmp2["det"] = user_decks[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue monsters.append(tmp2) if place == "grave": if mine_or_other == 1: tmp = self.graves[deck_id]["mygrave"] elif mine_or_other == 2: tmp = self.graves[deck_id]["othergrave"] else: tmp = self.graves[deck_id]["commongrave"] user_graves = tmp for index in range(len(user_graves)): if place_unique_id == user_graves[index]["place_unique_id"]: if not self.check_not_effected( user_graves[index], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, cost, ): tmp2 = {} tmp2["det"] = user_graves[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue monsters.append(tmp2) if place == "hand": if mine_or_other == 1: tmp = self.hands[deck_id]["myhand"] elif mine_or_other == 2: tmp = self.hands[deck_id]["otherhand"] else: tmp = self.hands[deck_id]["commonhand"] user_hands = tmp for index in range(len(user_hands)): if place_unique_id == user_hands[index]["place_unique_id"]: if not self.check_not_effected( user_hands[index], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, cost, ): tmp2 = {} tmp2["det"] = user_hands[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue monsters.append(tmp2) field = self.field for monster_effect_det2 in monster_effect_monster: min_equation_number = self.calculate_boland( monster_effect_det2["min_equation_number"] ) monster_effect_det = monster_effect_det2["monster"] field_tmp = [] tmp_deck = None for place in monster_effect_det["place"]: place_tmp = place["det"].split("_") deck_id = int(place_tmp[1]) if place_tmp[0] == "deck": chain_user2 = json.loads(duel.chain_user) effect_user = chain_user2[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["mydeck"], monster_effect_det2, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other, cost, ) org_deck = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["otherdeck"], monster_effect_det2, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other, cost, ) org_deck = self.decks[deck_id]["otherdeck"] else: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["commondeck"], monster_effect_det2, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other, cost, ) org_deck = self.decks[deck_id]["commondeck"] user_decks = org_deck if not tmp_deck: return [monsters, 0] if "move_how" not in monster_effect_det: for index3 in range(len(user_decks)): if not self.check_not_effected( user_decks[index3], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): tmp2 = {} tmp2["det"] = user_decks[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[index3][ "place_unique_id" ] monsters.append(tmp2) continue elif monster_effect["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: for index2 in range(len(user_decks[range_i]["variables"])): if not self.check_not_effected( user_decks[range_i], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): tmp2 = {} tmp2["det"] = user_decks[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[range_i][ "place_unique_id" ] monsters.append(tmp2) elif place_tmp[0] == "grave": chain_user2 = json.loads(duel.chain_user) effect_user = chain_user2[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "2" and effect_user == self.user) or ( place_tmp[2] == "1" and effect_user != self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_grave_with_effect( self.graves[deck_id]["mygrave"], monster_effect_det2, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other, cost, ) org_grave = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: tmp_deck = self.get_grave_with_effect( self.graves[deck_id]["othergrave"], monster_effect_det2, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other, cost, ) org_grave = self.graves[deck_id]["othergrave"] else: tmp_deck = self.get_grave_with_effect( self.graves[deck_id]["commongrave"], monster_effect_det2, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other, cost, ) org_grave = self.graves[deck_id]["commongrave"] user_graves = org_grave if not tmp: return [monsters, 0] if "move_how" not in monster_effect_det: for index3 in range(len(user_graves)): if not self.check_not_effected( user_graves[index3], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, cost, ): tmp2 = {} tmp2["det"] = user_graves[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[index3][ "place_unique_id" ] monsters.append(tmp2) continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: if not self.check_not_effected( user_graves[range_i], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, cost, ): # log表示用 tmp2 = {} tmp2["det"] = user_graves[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[range_i][ "place_unique_id" ] monsters.append(tmp2) elif place_tmp[0] == "hand": chain_user2 = json.loads(duel.chain_user) effect_user = chain_user2[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "2" and effect_user == self.user) or ( place_tmp[2] == "1" and effect_user != self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_hand_with_effect( self.hands[deck_id]["myhand"], monster_effect_det2, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other, cost, ) org_hand = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: tmp_deck = self.get_hand_with_effect( self.hands[deck_id]["otherhand"], monster_effect_det2, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other, cost, ) org_hand = self.hands[deck_id]["otherhand"] else: tmp_deck = self.get_hand_with_effect( self.hands[deck_id]["commonhand"], monster_effect_det2, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other, cost, ) org_hand = self.hands[deck_id]["commonhand"] user_hands = org_hand if not user_hands: return [monsters, 0] if "move_how" not in monster_effect_det: for index3 in range(len(user_hands)): if not self.check_not_effected( user_hands[index3], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, cost, ): # log表示用 tmp2 = {} tmp2["det"] = user_hands[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[index3][ "place_unique_id" ] monsters.append(tmp2) continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: if not self.check_not_effected( user_hands[range_i], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, cost, ): # log表示用 tmp2 = {} tmp2["det"] = user_hands[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[range_i][ "place_unique_id" ] monsters.append(tmp2) elif place_tmp[0] == "field": field_tmp.append(place_tmp[1]) if place["and_or"] == "and": continue else: field_tmp2 = field_tmp field_tmp = [] effect_user = chain_user if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user == 2 ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user == 2) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other2 = 2 else: mine_or_other2 = 3 for x in range(len(field)): for y in range(len(field[x])): exclude = "" field_kind_flag = True if self.field_free is False: kind = field[x][y]["kind"] else: kind = field[0][y]["kind"] if kind != "": tmp = kind.split("_") for kind in field_tmp2: if kind not in tmp: field_kind_flag = False break if field_kind_flag is False: continue if field[x][y]["mine_or_other"] != mine_or_other2: continue if field[x][y]["det"] is None: continue if self.check_not_effected( field[x][y]["det"], chain_user, effect_kind, "field", 0, x, y, field[x][y]["mine_or_other"], cost, ): continue tmp2 = {} tmp2["det"] = field[x][y]["det"] tmp2["mine_or_other"] = field[x][y]["mine_or_other"] tmp2["user"] = chain_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] if self.validate_answer( tmp2, monster_effect_det, exclude, duel ): monsters.append(tmp2) change_val = 0 mine_or_other_absolute = mine_or_other_val if chain_user == 1: pass elif mine_or_other_val == 1: mine_or_other_absolute = 2 elif mine_or_other_val == 2: mine_or_other_absolute = 1 for monster in monsters: change_val_det = self.calculate_boland( monster_effect_text["variable_change_val"], monster, False, 0, None, effect_kind_rel, ) change_val += change_val_det if accumulate_flag is False: self.raise_trigger_change_val( monster, change_val_det, cost, effect_kind, chain_user, 1 ) if accumulate_flag is True: global_name = {} global_name["mine_or_other"] = mine_or_other_absolute global_name["variable_id"] = variable_id global_name["variable_how"] = monster_effect_text["variable_change_how"] self.accumulate_global( monster, change_val_det, cost, effect_kind, chain_user, global_name ) if duel.alt_global != "": alt_val = self.change_alt_global2( variable_id, mine_or_other_absolute, monster_effect_text["variable_change_how"], effect_kind, change_val, ) change_val -= alt_val instead_val = self.check_variable_instead( variable_id, mine_or_other_absolute, change_val, cost, chain_user, effect_kind, ) change_val -= instead_val if accumulate_flag is False: self.raise_trigger_change_val( monster, change_val_det, cost, effect_kind, chain_user, 0 ) if cost == 1: cost_result = self.cost_result if "global_change_val" not in cost_result: cost_result["global_change_val"] = [] tmp = {} tmp["mine_or_other"] = mine_or_other_absolute tmp["variable"] = variable tmp["variable_id"] = variable_id tmp["change_val"] = change_val tmp["change_how"] = monster_effect_text["variable_change_how"] cost_result["global_change_val"].append(tmp) self.cost_result = cost_result elif accumulate_flag is False: if mine_or_other_absolute == 0: if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["value"] = change_val elif mine_or_other_absolute == 1: if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["1_value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["1_value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["1_value"] = change_val elif mine_or_other_absolute == 2: if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["2_value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["2_value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["2_value"] = change_val duel.global_variable = json.dumps(variable) return [monsters, change_val] def change_alt_global(self, cost=0): duel = self.duel chain_det = json.loads(self.duel.chain_det) chain_user = json.loads(self.duel.chain_user) if cost == 0: user = chain_user[str(duel.chain - 1)] monster_effect_wrapper = MonsterEffectWrapper.objects.get( id=int(chain_det[str(duel.chain - 1)]) ) monster_effect = monster_effect_wrapper.monster_effect monster_effect_text = json.loads(monster_effect.monster_effect) effect_kind = monster_effect_wrapper.monster_effect_kind else: user = chain_user[str(self.tmp_chain)] cost_det = duel.cost_det cost_wrapper = CostWrapper.objects.get(id=cost_det) effect_kind = cost_wrapper.cost_kind cost_unwrap = cost_wrapper.cost monster_effect_text = json.loads(cost_unwrap.cost) variable_id = monster_effect_text["variable_name"].split("_") mine_or_other = int(variable_id[2]) variable_id = variable_id[1] change_val = int(monster_effect_text["variable_change_val"]) if duel.alt_global != "": variable = json.loads(duel.alt_global) else: variable = {} global_name = {} if (mine_or_other == 1 and user == 1) or (mine_or_other == 2 and user == 2): global_name["mine_or_other"] = 1 elif (mine_or_other == 1 and user == 2) or (mine_or_other == 1 and user == 2): global_name["mine_or_other"] = 2 else: global_name["mine_or_other"] = 3 global_name["variable_id"] = variable_id if str(variable_id) not in variable: variable[str(variable_id)] = {} if mine_or_other == 0: if "value" not in variable[str(variable_id)]: variable[str(variable_id)]["value"] = 0 variable[str(variable_id)]["effect_kind"] = effect_kind if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["value"] += change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["value"] -= change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["value"] = change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif (mine_or_other == 1 and user == 1) or (mine_or_other == 2 and user == 2): if "1_value" not in variable[str(variable_id)]: variable[str(variable_id)]["1_value"] = 0 variable[str(variable_id)]["effect_kind"] = effect_kind if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["1_value"] += change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["1_value"] -= change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["1_value"] = change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif (mine_or_other == 2 and user == 1) or (mine_or_other == 1 and user == 2): if "2_value" not in variable[str(variable_id)]: variable[str(variable_id)]["2_value"] = 0 variable[str(variable_id)]["effect_kind"] = effect_kind if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["2_value"] += change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["2_value"] -= change_val variable[str(variable_id)]["effect_kind"] = effect_kind elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["2_value"] = change_val variable[str(variable_id)]["effect_kind"] = effect_kind duel.alt_global = json.dumps(variable) return change_val def change_alt_global2( self, variable_id, mine_or_other, variable_change_how, effect_kind, change_val, ): duel = self.duel alt_val = 0 alt_global = json.loads(self.duel.alt_global) if str(variable_id) in alt_global: if mine_or_other == 0 and variable_change_how == 1: if "value" in alt_global[str(variable_id)]: if self.check_effect_kind( alt_global[str(variable_id)]["effect_kind"], effect_kind ): alt_val = min(change_val, alt_global[str(variable_id)]["value"]) alt_global[str(variable_id)]["value"] -= alt_val change_val -= alt_val duel.alt_global = json.dumps(alt_global) if ( (mine_or_other == 1 ) and variable_change_how == 1 ): if "1_value" in alt_global[str(variable_id)]: if self.check_effect_kind( alt_global[str(variable_id)]["effect_kind"], effect_kind ): alt_val = min( change_val, alt_global[str(variable_id)]["1_value"] ) alt_global[str(variable_id)]["1_value"] -= alt_val change_val -= alt_val duel.alt_global = json.dumps(alt_global) if ( (mine_or_other == 2 ) and variable_change_how == 1 ): if "2_value" in alt_global[str(variable_id)]: if self.check_effect_kind( alt_global[str(variable_id)]["effect_kind"], effect_kind ): alt_val = min( change_val, alt_global[str(variable_id)]["2_value"] ) alt_global[str(variable_id)]["2_value"] -= alt_val change_val -= alt_val self.duel.alt_global = json.dumps(alt_global) return alt_val def change_show(self, cost=0,monster_effect= None): duel = self.duel chain_det = json.loads(self.duel.chain_det) chain_user = json.loads(self.duel.chain_user) user = chain_user[str(duel.chain - 1)] monster_effect_wrapper = MonsterEffectWrapper.objects.get( id=int(chain_det[str(duel.chain - 1)]) ) monster_effect = monster_effect_wrapper.monster_effect monster_effect_text = json.loads(monster_effect.monster_effect) variable = json.loads(duel.global_variable) variable_id = monster_effect_text["variable_name"].split("_") mine_or_other = int(variable_id[2]) variable_id = variable_id[1] global_name = {} if (mine_or_other == 1 and user == 1) or (mine_or_other == 2 and user == 2): global_name["mine_or_other"] = 1 elif (mine_or_other == 2 and user == 1) or (mine_or_other == 1 and user == 2): global_name["mine_or_other"] = 2 else: global_name["mine_or_other"] = 0 global_name["variable_id"] = variable_id global_name["variable_how"] = monster_effect_text["variable_change_how"] if mine_or_other == 0: if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["show"] = 0 elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["show"] = 1 elif (mine_or_other == 1 and user == 1) or ( mine_or_other == 2 and user == 2 ): if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["1_show"] = 0 elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["1_show"] = 1 elif (mine_or_other == 2 and user == 1) or ( mine_or_other == 1 and user == 2 ): if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["2_show"] = 0 elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["2_show"] = 1 duel.global_variable = json.dumps(variable) return monster_effect_text["variable_change_how"] def change_variable(self, cost=0,monster_effect= None): duel = self.duel chain_det = json.loads(self.duel.chain_det) chain_user = json.loads(self.duel.chain_user) if cost == 0: user = chain_user[str(duel.chain - 1)] monster_effect_wrapper = MonsterEffectWrapper.objects.get( id=int(chain_det[str(duel.chain - 1)]) ) monster_effect = monster_effect_wrapper.monster_effect monster_effect_text = json.loads(monster_effect.monster_effect) effect_kind = monster_effect_wrapper.monster_effect_kind change_val_flag = monster_effect.change_val_monster_flag accumulate_flag = monster_effect.accumulate_flag elif cost ==1: user = chain_user[str(self.tmp_chain)] cost_det = duel.cost_det cost_wrapper = CostWrapper.objects.get(id=cost_det) effect_kind = cost_wrapper.cost_kind cost_unwrap = cost_wrapper.cost monster_effect_text = json.loads(cost_unwrap.cost) change_val_flag = False accumulate_flag = False else: user = self.user monster_effect_text = json.loads(monster_effect.monster_effect) effect_kind = "" change_val_flag = False accumulate_flag = False variable_id = monster_effect_text["variable_name"].split("_") mine_or_other = int(variable_id[2]) variable_id = variable_id[1] variable = json.loads(duel.global_variable) global_name = {} if (mine_or_other == 1 and user == 1) or (mine_or_other == 2 and user == 2): global_name["mine_or_other"] = 1 elif (mine_or_other == 2 and user == 1) or (mine_or_other == 1 and user == 2): global_name["mine_or_other"] = 2 else: global_name["mine_or_other"] = 0 global_name["variable_id"] = variable_id global_name["variable_how"] = monster_effect_text["variable_change_how"] if change_val_flag is True: change_val = self.calculate_boland( monster_effect_text["variable_change_val"], None, False, 0, None, "", variable_id, effect_kind, accumulate_flag, global_name, ) else: change_val = self.calculate_boland( monster_effect_text["variable_change_val"], None, False, 0, None, "", False, effect_kind, accumulate_flag, global_name, ) if accumulate_flag is True: change_val = 0 if cost == 1: cost_result = self.cost_result if "global_change_val" not in cost_result: cost_result["global_change_val"] = [] tmp = {} tmp["mine_or_other"] = mine_or_other tmp["variable"] = variable tmp["variable_id"] = variable_id tmp["change_val"] = change_val tmp["change_how"] = monster_effect_text["variable_change_how"] cost_result["global_change_val"].append(tmp) self.cost_result = cost_result else: if duel.alt_global != "": alt_val = self.change_alt_global2( variable_id, mine_or_other, monster_effect_text["variable_change_how"], effect_kind, change_val, ) change_val -= alt_val instead_val = self.check_variable_instead( variable_id, mine_or_other, change_val, cost, chain_user, effect_kind, ) change_val -= instead_val if mine_or_other == 0: if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["value"] = change_val elif (mine_or_other == 1 and user == 1) or ( mine_or_other == 2 and user == 2 ): if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["1_value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["1_value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["1_value"] = change_val elif (mine_or_other == 2 and user == 1) or ( mine_or_other == 1 and user == 2 ): if monster_effect_text["variable_change_how"] == 0: variable[str(variable_id)]["2_value"] += change_val elif monster_effect_text["variable_change_how"] == 1: variable[str(variable_id)]["2_value"] -= change_val elif monster_effect_text["variable_change_how"] == 2: variable[str(variable_id)]["2_value"] = change_val duel.global_variable = json.dumps(variable) return change_val def change_monster_relation_cost( self, monster_effect, effect_kind, monster_condition ): self.change_monster_relation(monster_effect, effect_kind, monster_condition, 1) def copy_monster_det_specify(self, monster, monster_effect, effect_kind): if "eternal" not in monster: monster["eternal"] = [] tmp = {} copy_monster = Monster.objects.get(id=int(monster_effect["monster"][0]["monster"]["monster_effect"])) if monster_effect["copy_id"] is True: tmp["id"] = int(monster_effect["monster"][0]["monster"]["monster_effect"]) if monster_effect["copy_monster_name"] is True: tmp["monster_name"] = copy_monster.monster_name tmp["monster_variable_change_life"] = monster_effect[ "monster_variable_change_life" ][0] tmp["monster_variable_change_life_length"] = monster_effect[ "monster_variable_change_life_length" ][0] tmp["variables"] = {} tmp["effect_kind"] = effect_kind monster["eternal"].append(tmp) return monster def copy_monster_det(self, monster, copy_monster, monster_effect, effect_kind): if "eternal" not in monster: monster["eternal"] = [] tmp = {} if monster_effect["copy_id"] is True: id = self.get_monster_id( copy_monster[-1]["det"], copy_monster[-1]["place"], 0, 0, 0, 0, 0 ) tmp["id"] = id if monster_effect["copy_monster_name"] is True: tmp["monster_name"] = copy_monster[-1]["det"]["monster_name"] tmp["monster_variable_change_life"] = monster_effect[ "monster_variable_change_life" ][0] tmp["monster_variable_change_life_length"] = monster_effect[ "monster_variable_change_life_length" ][0] tmp["variables"] = {} j = 0 for monster_variable in monster_effect["copy_monster_variables"]: ini_from = monster_effect["copy_monster_variables_from_initial"][j] tmp["variables"][monster_variable] = {} tmp_variable = copy_monster[-1]["det"]["variables"][monster_variable][ "value" ] if "eternal" in copy_monster[-1]["det"]: for i in range(len(copy_monster[-1]["det"]["eternal"])): if ( copy_monster[-1]["det"]["eternal"][i] is not None and monster_variable in copy_monster[-1]["det"]["eternal"][i]["variables"] ): if ( copy_monster[-1]["det"]["eternal"][i]["variables"][ monster_variable ]["ini"] == 0 and ini_from is True ): continue else: tmp_variable += copy_monster[-1]["det"]["eternal"][i][ "variables" ][monster_variable]["value"] tmp["variables"][monster_variable]["value"] = tmp_variable if monster_effect["copy_monster_variables_to_initial"][j] is True: tmp["variables"][monster_variable]["ini"] = True else: tmp["variables"][monster_variable]["ini"] = False j += 1 tmp["effect_kind"] = effect_kind monster["eternal"].append(tmp) return monster def copy_monster_cost(self, monster_effect, monster_condition, effect_kind): return self.copy_monster(monster_effect, monster_condition, effect_kind, 1) def copy_monster_specify(self, monster_effect, monster_condition, effect_kind, cost=0): duel = self.duel chain_user = json.loads(duel.chain_user) if cost == 0: chain_user = chain_user[str(duel.chain - 1)] else: chain_user = chain_user[str(self.tmp_chain)] field = self.field monster_effect = json.loads(monster_effect) exclude = monster_effect["exclude"] monster_effect_monster = monster_effect["monster"] return_value = {} return_value["monsters"] = [] return_value["monsters2"] = [] if monster_condition != "": monster_condition = json.loads(monster_condition) monster_condition = monster_condition["monster"][0]["monster"] if len(monster_effect["monster_variable_change_name"]) != 0: change_val_eternal = {} if "persist" in monster_effect: if monster_effect["persist"][0] is True: change_val_eternal["persist"] = True change_val_eternal["variables"] = {} change_val_eternal["monster_variable_change_life"] = monster_effect[ "monster_variable_change_life" ][0] change_val_eternal["monster_variable_change_life_length"] = monster_effect[ "monster_variable_change_life_length" ][0] change_val_eternal["effect_kind"] = monster_effect[ "monster_variable_change_effect_kind" ][0] for index in range(len(monster_effect["monster_variable_change_name"])): variable_name = monster_effect["monster_variable_change_name"][index] if "monster_variable_change_initial" in monster_effect: ini = monster_effect["monster_variable_change_initial"][index] else: ini = False if "monster_variable_change_add" in monster_effect: add = monster_effect["monster_variable_change_add"][index] else: add = 0 change_val_eternal["variables"][variable_name] = {} change_val_eternal["variables"][variable_name]["value"] = str( self.calculate_boland( monster_effect["monster_variable_change_val"][index], None, False, 1, ) ) change_val_eternal["variables"][variable_name]["ini"] = ini change_val_eternal["variables"][variable_name]["add"] = add else: change_val_eternal = None for monster_effect_det in monster_effect_monster: if "as_monster_condition" not in monster_effect_det: continue if monster_effect_det["as_monster_condition"] == "": continue as_monsters = monster_effect_det["as_monster_condition"] if not isinstance(as_monsters, list): tmp_monster = [] tmp_monster.append(as_monsters) as_monsters = tmp_monster for as_monster in as_monsters: if as_monster[0] == "~": tmp = self.cost if duel.in_cost is True: tmp = tmp[str(self.tmp_chain)] else: tmp = tmp[str(int(duel.chain - 1))] place1 = tmp[as_monster] elif as_monster[0] == "%": tmp = self.timing_mess place1 = tmp[as_monster] elif as_monster[0] == "-": tmp = self.mess tmp = tmp[str(int(duel.chain - 2))] if as_monster in tmp: place1 = tmp[as_monster] else: place1 = [] else: tmp = self.mess tmp = tmp[str(int(duel.chain - 1))] place1 = tmp[as_monster] for place2 in reversed(place1): place = place2["place"] if place == "field": x = int(place2["x"]) y = int(place2["y"]) field = self.field if cost == 0: if "place_unique_id" in place2: place_unique_id = place2["place_unique_id"] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue if ( "det" not in field[x][y] or field[x][y]["det"] is None or field[x][y]["det"]["place_unique_id"] != place_unique_id ): continue if self.check_not_effected( field[x][y]["det"], chain_user, effect_kind, "field", 0, x, y, field[x][y]["mine_or_other"], cost, ): continue tmp2 = {} tmp2["det"] = field[x][y]["det"] tmp2["mine_or_other"] = field[x][y]["mine_or_other"] tmp2["user"] = chain_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue field[x][y]["det"] = self.copy_monster_det_specify( field[x][y]["det"], monster_effect, effect_kind, ) if change_val_eternal is not None: if "eternal" not in field[x][y]["det"]: field[x][y]["det"]["eternal"] = [] field[x][y]["det"]["eternal"].append( change_val_eternal ) self.field = field continue mine_or_other = place2["mine_or_other"] deck_id = place2["deck_id"] place_unique_id = place2["place_unique_id"] if (chain_user == 1 and mine_or_other == "1") or ( chain_user != 1 and mine_or_other == "2" ): mine_or_other_for_cost_copy = 1 elif (1 != chain_user and mine_or_other == "1") or ( chain_user == 1 and mine_or_other == "2" ): mine_or_other_for_cost_copy = 2 else: mine_or_other_for_cost_copy = 3 if (self.user == chain_user and mine_or_other == "1") or ( chain_user != self.user and mine_or_other == "2" ): mine_or_other = "1" elif (self.user != chain_user and mine_or_other == "1") or ( chain_user == self.user and mine_or_other == "2" ): mine_or_other = "2" else: mine_or_other = "3" if place == "deck": if mine_or_other == "1": tmp = self.decks[deck_id]["mydeck"] elif mine_or_other == "2": tmp = self.decks[deck_id]["otherdeck"] else: tmp = self.decks[deck_id]["commondeck"] user_decks = tmp for index in range(len(user_decks)): if place_unique_id == user_decks[index]["place_unique_id"]: if cost == 0: if not self.check_not_effected( user_decks[index], chain_user, effect_kind, "deck", deck_id, 0, 0, place2["mine_or_other"], cost, ): tmp2 = {} tmp2["det"] = user_decks[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue return_value["monsters"].append(tmp2) user_decks[index] = self.copy_monster_det_specify( user_decks[index], monster_effect, effect_kind, ) if change_val_eternal is not None: if "eternal" not in user_decks[index]: user_decks[index]["eternal"] = [] user_decks[index]["eternal"].append( change_val_eternal ) if mine_or_other == "1": self.decks[deck_id]["mydeck"] = user_decks elif mine_or_other == "2": self.decks[deck_id]["otherdeck"] = user_decks else: self.decks[deck_id]["commondeck"] = user_decks if place == "grave": if mine_or_other == "1": tmp = self.graves[deck_id]["mygrave"] elif mine_or_other == "2": tmp = self.graves[deck_id]["othergrave"] else: tmp = self.graves[deck_id]["commongrave"] user_graves = tmp for index in range(len(user_graves)): if place_unique_id == user_graves[index]["place_unique_id"]: if cost == 0: if not self.check_not_effected( user_graves[index], chain_user, effect_kind, "grave", deck_id, 0, 0, place2["mine_or_other"], cost, ): tmp2 = {} tmp2["det"] = user_graves[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue return_value["monsters"].append(tmp2) user_graves[index] = self.copy_monster_det_specify( user_graves[index], monster_effect, effect_kind, ) if change_val_eternal is not None: if "eternal" not in user_graves[index]: user_graves[index]["eternal"] = [] user_graves[index]["eternal"].append( change_val_eternal ) if mine_or_other == "1": self.graves[deck_id]["mygrave"] = user_graves elif mine_or_other == "2": self.graves[deck_id]["othergrave"] = user_graves else: self.graves[deck_id][ "commongrave" ] = user_graves if place == "hand": if mine_or_other == "1": tmp = self.hands[deck_id]["myhand"] elif mine_or_other == "2": tmp = self.hands[deck_id]["otherhand"] else: tmp = self.hands[deck_id]["commonhand"] user_hands = tmp for index in range(len(user_hands)): if place_unique_id == user_hands[index]["place_unique_id"]: if cost == 0: if not self.check_not_effected( user_hands[index], chain_user, effect_kind, "hand", deck_id, 0, 0, place2["mine_or_other"], cost, ): tmp2 = {} tmp2["det"] = user_hands[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue return_value["monsters"].append(tmp2) user_hands[index] = self.copy_monster_det_specify( user_hands[index], monster_effect, effect_kind, ) if change_val_eternal is not None: if "eternal" not in user_hands[index]: user_hands[index]["eternal"] = [] user_hands[index]["eternal"].append( change_val_eternal ) if mine_or_other == "1": self.hands[deck_id]["myhand"] = user_hands elif mine_or_other == "2": self.hands[deck_id]["otherhand"] = user_hands else: self.hands[deck_id]["commonhand"] = user_hands for monster_effect_det2 in monster_effect_monster: monster_effect_det = monster_effect_det2["monster"] field_tmp = [] tmp_deck = None for place in monster_effect_det["place"]: place_tmp = place["det"].split("_") deck_id = int(place_tmp[1]) if place_tmp[0] == "deck": chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if self.user == duel.user_turn: mine_or_other3 = mine_or_other2 else: if mine_or_other2 == 1: mine_or_other3 = 2 elif mine_or_other2 == 2: mine_or_other3 = 1 else: mine_or_other3 = mine_or_other2 if mine_or_other2 == 1: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["mydeck"], monster_effect_det, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other3, cost, ) org_deck = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["otherdeck"], monster_effect_det, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other3, cost, ) org_deck = self.decks[deck_id]["otherdeck"] else: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["commondeck"], monster_effect_det, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other3, cost, ) org_deck = self.decks[deck_id]["commondeck"] user_decks = org_deck if not tmp_deck: return min_equation_number = self.calculate_boland( monster_effect_det["min_equation_number"], None, False ) if "move_how" not in monster_effect_det: for index3 in range(len(user_decks)): if not self.check_not_effected( user_decks[index3], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_decks[index3]: user_decks[index3]["eternal"] = [] user_decks[index3]["eternal"].append( change_val_eternal ) if cost == 0: if not self.check_not_effected( user_decks[index3], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): tmp2 = {} tmp2["det"] = user_decks[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[ index3 ]["place_unique_id"] return_value["monsters"].append(tmp2) user_decks[index3] = self.copy_monster_det_specify( user_decks[index3], monster_effect, effect_kind, ) if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.decks[deck_id]["mydeck"] = user_decks elif mine_or_other2 == 2: self.decks[deck_id]["otherdeck"] = user_decks else: self.decks[deck_id]["commondeck"] = user_decks continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: for index2 in range(len(user_decks[range_i]["variables"])): if not self.check_not_effected( user_decks[range_i], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_decks[range_i]: user_decks[range_i]["eternal"] = [] user_decks[range_i]["eternal"].append( change_val_eternal ) else: cost_result = self.cost_result cost_result_tmp = {} cost_result_tmp[ "change_variable" ] = change_val_eternal cost_result_tmp["place_unique_id"] = user_decks[ range_i ]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["variable"]["deck"].append( cost_result_tmp ) self.cost_result = cost_result if cost == 0: if not self.check_not_effected( user_decks[range_i], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_decks[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[range_i][ "place_unique_id" ] return_value["monsters"].append(tmp2) user_decks[range_i] = self.copy_monster_det_specify( user_decks[range_i], monster_effect, effect_kind, ) if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.decks[deck_id]["mydeck"] = user_decks elif mine_or_other2 == 2: self.decks[deck_id]["otherdeck"] = user_decks else: self.decks[deck_id]["commondeck"] = user_decks elif place_tmp[0] == "grave": chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_grave_with_effect( self.graves[deck_id]["mygrave"], monster_effect_det, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other3, cost, ) org_grave = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: tmp_grave = self.get_grave_with_effect( self.graves[deck_id]["othergrave"], monster_effect_det, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other3, cost, ) org_grave = self.graves[deck_id]["othergrave"] else: tmp_grave = self.get_grave_with_effect( self.graves[deck_id]["commongrave"], monster_effect_det, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other3, cost, ) org_grave = self.graves[deck_id]["commongrave"] user_graves = org_grave if not tmp_grave: return if "move_how" not in monster_effect_det: for index3 in range(len(user_graves)): if not self.check_not_effected( user_graves[index3], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): if cost == 0: if not self.check_not_effected( user_graves[index3], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_graves[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[index3][ "place_unique_id" ] return_value["monsters"].append(tmp2) user_graves[index3] = self.copy_monster_det_specify( user_graves[index3], monster_effect, effect_kind, ) for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_graves[index3]: user_graves[index3]["eternal"] = [] user_graves[index3]["eternal"].append( change_val_eternal ) if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.graves[deck_id]["mygrave"] = user_graves elif mine_or_other2 == 2: self.graves[deck_id]["othergrave"] = user_graves else: self.graves[deck_id]["commongrave"] = user_graves continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: for index2 in range(len(user_graves[range_i]["variables"])): if not self.check_not_effected( user_graves[range_i], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_graves[range_i]: user_graves[range_i]["eternal"] = [] user_graves[range_i]["eternal"].append( change_val_eternal ) if cost == 0: if not self.check_not_effected( user_graves[range_i], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_graves[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[range_i][ "place_unique_id" ] return_value["monsters"].append( user_graves[range_i] ) user_graves[range_i] = self.copy_monster_det_specify( user_graves[range_i], monster_effect, effect_kind, ) if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.graves[deck_id]["mygrave"] = user_graves elif mine_or_other2 == 2: self.graves[deck_id]["othergrave"] = user_graves else: self.graves[deck_id]["commongrave"] = user_graves elif place_tmp[0] == "hand": chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_hand_with_effect( self.hands[deck_id]["myhand"], monster_effect_det, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other3, cost, ) org_hand = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: tmp_hand = self.get_hand_with_effect( self.hands[deck_id]["otherhand"], monster_effect_det, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other3, cost, ) org_hand = self.hands[deck_id]["otherhand"] else: tmp_hand = self.get_hand_with_effect( self.hands[deck_id]["commonhand"], monster_effect_det, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other3, cost, ) org_hand = self.hands[deck_id]["commonhand"] user_hands = org_hand if not tmp_hand: return if "move_how" not in monster_effect_det: for index3 in range(len(user_hands)): if not self.check_not_effected( user_hands[index3], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): if cost == 0: if not self.check_not_effected( user_hands[index3], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_hands[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[index3][ "place_unique_id" ] return_value["monsters"].append(tmp2) user_hands[index3] = self.copy_monster_det_spcify( user_hands[index3], monster_effect, effect_kind, ) for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_hands[index3]: user_hands[index3]["eternal"] = [] user_hands[index3]["eternal"].append( change_val_eternal ) if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.hands[deck_id]["myhand"] = user_hands elif mine_or_other2 == 2: self.hands[deck_id]["otherhand"] = user_hands else: self.hands[deck_id]["commonhand"] = user_hands continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: for index2 in range(len(user_hands[range_i]["variables"])): if not self.check_not_effected( user_hands[range_i], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_hands[range_i]: user_hands[range_i]["eternal"] = [] user_hands[range_i]["eternal"].append( change_val_eternal ) if cost == 0: if not self.check_not_effected( user_hands[range_i], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_hands[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[range_i][ "place_unique_id" ] return_value["monsters"].append(tmp2) user_hands[range_i] = self.copy_monster_det_specify( user_hands[range_i], monster_effect, effect_kind, ) if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.hands[deck_id]["myhand"] = user_hands elif mine_or_other2 == 2: self.hands[deck_id]["otherhand"] = user_hands else: self.hands[deck_id]["commonhand"] = user_hands elif place_tmp[0] == "field": field_tmp.append(place_tmp[1]) if place["and_or"] == "and": continue else: field_tmp2 = field_tmp field_tmp = [] chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user == 2 ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user == 2) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other2 = 2 else: mine_or_other2 = 3 for x in range(len(field)): for y in range(len(field[x])): exclude = "" field_kind_flag = True if self.field_free is False: kind = field[x][y]["kind"] else: kind = field[0][y]["kind"] if kind != "": tmp = kind.split("_") for kind in field_tmp2: if kind not in tmp: field_kind_flag = False break if field_kind_flag is False: continue if field[x][y]["mine_or_other"] != mine_or_other2: continue if field[x][y]["det"] is None: continue tmp2 = {} tmp2["det"] = field[x][y]["det"] tmp2["mine_or_other"] = field[x][y]["mine_or_other"] tmp2["user"] = chain_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] if self.check_not_effected( field[x][y]["det"], chain_user, effect_kind, "field", 0, x, y, field[x][y]["mine_or_other"], cost, ): continue if self.validate_answer( tmp2, monster_effect_det, exclude, duel ): if cost == 0: return_value["monsters"].append(tmp2) field[x][y]["det"] = self.copy_monster_det_specify( field[x][y]["det"], monster_effect, effect_kind, ) self.field = field return return_value def copy_monster(self, monster_effect, monster_condition, effect_kind, cost=0): duel = self.duel chain_user = json.loads(duel.chain_user) if cost == 0: chain_user = chain_user[str(duel.chain - 1)] else: chain_user = chain_user[str(self.tmp_chain)] field = self.field monster_effect = json.loads(monster_effect) exclude = monster_effect["exclude"] monster_effect_monster = monster_effect["monster"] return_value = {} return_value["monsters"] = [] return_value["monsters2"] = [] if monster_condition != "": monster_condition = json.loads(monster_condition) monster_condition = monster_condition["monster"][0]["monster"] if len(monster_effect["monster_variable_change_name"]) != 0: change_val_eternal = {} if "persist" in monster_effect: if monster_effect["persist"][0] is True: change_val_eternal["persist"] = True change_val_eternal["variables"] = {} change_val_eternal["monster_variable_change_life"] = monster_effect[ "monster_variable_change_life" ][0] change_val_eternal["monster_variable_change_life_length"] = monster_effect[ "monster_variable_change_life_length" ][0] change_val_eternal["effect_kind"] = monster_effect[ "monster_variable_change_effect_kind" ][0] for index in range(len(monster_effect["monster_variable_change_name"])): variable_name = monster_effect["monster_variable_change_name"][index] if "monster_variable_change_initial" in monster_effect: ini = monster_effect["monster_variable_change_initial"][index] else: ini = False if "monster_variable_change_add" in monster_effect: add = monster_effect["monster_variable_change_add"][index] else: add = 0 change_val_eternal["variables"][variable_name] = {} change_val_eternal["variables"][variable_name]["value"] = str( self.calculate_boland( monster_effect["monster_variable_change_val"][index], None, False, 1, ) ) change_val_eternal["variables"][variable_name]["ini"] = ini change_val_eternal["variables"][variable_name]["add"] = add else: change_val_eternal = None for monster_effect_det in monster_effect_monster: if "as_monster_condition" not in monster_effect_det: continue if monster_effect_det["as_monster_condition"] == "": continue as_monsters = monster_effect_det["as_monster_condition"] if not isinstance(as_monsters, list): tmp_monster = [] tmp_monster.append(as_monsters) as_monsters = tmp_monster for as_monster in as_monsters: if as_monster[0] == "~": tmp = self.cost if duel.in_cost is True: tmp = tmp[str(self.tmp_chain)] else: tmp = tmp[str(int(duel.chain - 1))] place1 = tmp[as_monster] elif as_monster[0] == "%": tmp = self.timing_mess place1 = tmp[as_monster] elif as_monster[0] == "-": tmp = self.mess tmp = tmp[str(int(duel.chain - 2))] if as_monster in tmp: place1 = tmp[as_monster] else: place1 = [] else: tmp = self.mess tmp = tmp[str(int(duel.chain - 1))] place1 = tmp[as_monster] for place2 in reversed(place1): place = place2["place"] if place == "field": x = int(place2["x"]) y = int(place2["y"]) field = self.field if cost == 0: if "place_unique_id" in place2: place_unique_id = place2["place_unique_id"] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue if ( "det" not in field[x][y] or field[x][y]["det"] is None or field[x][y]["det"]["place_unique_id"] != place_unique_id ): continue if self.check_not_effected( field[x][y]["det"], chain_user, effect_kind, "field", 0, x, y, field[x][y]["mine_or_other"], cost, ): continue tmp2 = {} tmp2["det"] = field[x][y]["det"] tmp2["mine_or_other"] = field[x][y]["mine_or_other"] tmp2["user"] = chain_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) if not relation_monster: return return_value return_value["monsters"].append(tmp2) return_value["monsters2"].append(relation_monster[-1]) field[x][y]["det"] = self.copy_monster_det( field[x][y]["det"], relation_monster, monster_effect, effect_kind, ) self.field = field continue else: place_unique_id = place2["place_unique_id"] if self.config.sort is True: x = self.search_place_unique_id(y,place_unique_id) if x == -1: continue else: if field[x][y]["det"]["place_unique_id"] != place_unique_id: continue if self.check_not_effected( field[x][y]["det"], chain_user, effect_kind, "field", 0, x, y, field[x][y]["mine_or_other"], cost, ): continue if monster_condition != "": tmp2 = {} tmp2["det"] = field[x][y]["det"] tmp2["mine_or_other"] = field[x][y]["mine_or_other"] tmp2["user"] = chain_user tmp2["place"] = "field" tmp2["deck_id"] = 0 tmp2["x"] = x tmp2["y"] = y tmp2["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] if not self.validate_answer( tmp2, monster_condition, "", duel ): continue cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "field" not in cost_result["copy"]: cost_result["copy"]["field"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) if not relation_monster: return return_value cost_result_tmp["copy_monster"] = relation_monster cost_result_tmp["cost_det"] = monster_effect cost_result_tmp["effect_kind"] = effect_kind cost_result_tmp["x"] = x cost_result_tmp["y"] = y cost_result_tmp["place_unique_id"] = field[x][y]["det"][ "place_unique_id" ] cost_result["copy"]["field"].append(cost_result_tmp) cost_result_tmp["det"] = field[x][y]["det"] return_value["monsters"].append(cost_result_tmp) return_value["monsters2"].append(relation_monster[-1]) self.cost_result = cost_result continue mine_or_other = place2["mine_or_other"] deck_id = place2["deck_id"] place_unique_id = place2["place_unique_id"] if (chain_user == 1 and mine_or_other == "1") or ( chain_user != 1 and mine_or_other == "2" ): mine_or_other_for_cost_copy = 1 elif (1 != chain_user and mine_or_other == "1") or ( chain_user == 1 and mine_or_other == "2" ): mine_or_other_for_cost_copy = 2 else: mine_or_other_for_cost_copy = 3 if (self.user == chain_user and mine_or_other == "1") or ( chain_user != self.user and mine_or_other == "2" ): mine_or_other = "1" elif (self.user != chain_user and mine_or_other == "1") or ( chain_user == self.user and mine_or_other == "2" ): mine_or_other = "2" else: mine_or_other = "3" if place == "deck": if mine_or_other == "1": tmp = self.decks[deck_id]["mydeck"] elif mine_or_other == "2": tmp = self.decks[deck_id]["otherdeck"] else: tmp = self.decks[deck_id]["commondeck"] user_decks = tmp for index in range(len(user_decks)): if place_unique_id == user_decks[index]["place_unique_id"]: if cost == 0: if not self.check_not_effected( user_decks[index], chain_user, effect_kind, "deck", deck_id, 0, 0, place2["mine_or_other"], cost, ): tmp2 = {} tmp2["det"] = user_decks[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(tmp2) return_value["monsters2"].append( relation_monster[-1] ) user_decks[index] = self.copy_monster_det( user_decks[index], relation_monster, monster_effect, effect_kind, ) if mine_or_other == "1": self.decks[deck_id]["mydeck"] = user_decks elif mine_or_other == "2": self.decks[deck_id]["otherdeck"] = user_decks else: self.decks[deck_id]["commondeck"] = user_decks else: cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "deck" not in cost_result["copy"]: cost_result["copy"]["deck"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp["copy_monster"] = relation_monster cost_result_tmp["cost_det"] = monster_effect cost_result_tmp["effect_kind"] = effect_kind cost_result_tmp["place_unique_id"] = user_decks[ index ]["place_unique_id"] cost_result_tmp[ "mine_or_other" ] = mine_or_other_for_cost_copy cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["deck"].append(cost_result_tmp) cost_result["det"] = user_decks[index] return_value["monsters"].append(cost_result_tmp) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result if place == "grave": if mine_or_other == "1": tmp = self.graves[deck_id]["mygrave"] elif mine_or_other == "2": tmp = self.graves[deck_id]["othergrave"] else: tmp = self.graves[deck_id]["commongrave"] user_graves = tmp for index in range(len(user_graves)): if place_unique_id == user_graves[index]["place_unique_id"]: if cost == 0: if not self.check_not_effected( user_graves[index], chain_user, effect_kind, "grave", deck_id, 0, 0, place2["mine_or_other"], cost, ): tmp2 = {} tmp2["det"] = user_graves[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(tmp2) return_value["monsters2"].append( relation_monster[-1] ) user_graves[index] = self.copy_monster_det( user_graves[index], relation_monster, monster_effect, effect_kind, ) if mine_or_other == "1": self.graves[deck_id]["mygrave"] = user_graves elif mine_or_other == "2": self.graves[deck_id]["othergrave"] = user_graves else: self.graves[deck_id][ "commongrave" ] = user_graves else: cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "grave" not in cost_result["copy"]: cost_result["copy"]["grave"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp["copy_monster"] = relation_monster cost_result_tmp["cost_det"] = monster_effect cost_result_tmp["effect_kind"] = effect_kind cost_result_tmp["place_unique_id"] = user_graves[ index ]["place_unique_id"] cost_result_tmp[ "mine_or_other" ] = mine_or_other_for_cost_copy cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["grave"].append(cost_result_tmp) cost_result_tmp["det"] = user_graves[index] return_value["monsters"].append(cost_result_tmp) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result if place == "hand": if mine_or_other == "1": tmp = self.hands[deck_id]["myhand"] elif mine_or_other == "2": tmp = self.hands[deck_id]["otherhand"] else: tmp = self.hands[deck_id]["commonhand"] user_hands = tmp for index in range(len(user_hands)): if place_unique_id == user_hands[index]["place_unique_id"]: if cost == 0: if not self.check_not_effected( user_hands[index], chain_user, effect_kind, "hand", deck_id, 0, 0, place2["mine_or_other"], cost, ): tmp2 = {} tmp2["det"] = user_hands[index] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[index][ "place_unique_id" ] if monster_condition != "": if not self.validate_answer( tmp2, monster_condition, "", duel ): continue relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(tmp2) return_value["monsters2"].append( relation_monster[-1] ) user_hands[index] = self.copy_monster_det( user_hands[index], relation_monster, monster_effect, effect_kind, ) if mine_or_other == "1": self.hands[deck_id]["myhand"] = user_hands elif mine_or_other == "2": self.hands[deck_id]["otherhand"] = user_hands else: self.hands[deck_id]["commonhand"] = user_hands else: cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "hand" not in cost_result["copy"]: cost_result["copy"]["hand"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp["copy_monster"] = relation_monster cost_result_tmp["cost_det"] = monster_effect cost_result_tmp["effect_kind"] = effect_kind cost_result_tmp["place_unique_id"] = user_hands[ index ]["place_unique_id"] cost_result_tmp[ "mine_or_other" ] = mine_or_other_for_cost_copy cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["hand"].append(cost_result_tmp) cost_result_tmp["det"] = user_hands[index] relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(cost_result_tmp) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result for monster_effect_det2 in monster_effect_monster: monster_effect_det = monster_effect_det2["monster"] field_tmp = [] tmp_deck = None for place in monster_effect_det["place"]: place_tmp = place["det"].split("_") deck_id = int(place_tmp[1]) if place_tmp[0] == "deck": chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if self.user == duel.user_turn: mine_or_other3 = mine_or_other2 else: if mine_or_other2 == 1: mine_or_other3 = 2 elif mine_or_other2 == 2: mine_or_other3 = 1 else: mine_or_other3 = mine_or_other2 if mine_or_other2 == 1: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["mydeck"], monster_effect_det, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other3, cost, ) org_deck = self.decks[deck_id]["mydeck"] elif mine_or_other2 == 2: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["otherdeck"], monster_effect_det, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other3, cost, ) org_deck = self.decks[deck_id]["otherdeck"] else: tmp_deck = self.get_deck_with_effect( self.decks[deck_id]["commondeck"], monster_effect_det, effect_kind, exclude, effect_user, "deck", deck_id, 0, 0, mine_or_other3, cost, ) org_deck = self.decks[deck_id]["commondeck"] user_decks = org_deck if not tmp_deck: return min_equation_number = self.calculate_boland( monster_effect_det["min_equation_number"], None, False ) if "move_how" not in monster_effect_det: for index3 in range(len(user_decks)): if not self.check_not_effected( user_decks[index3], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_decks[index3]: user_decks[index3]["eternal"] = [] user_decks[index3]["eternal"].append( change_val_eternal ) else: cost_result = self.cost_result cost_result_tmp = {} cost_result_tmp[ "change_variable" ] = monster_effect[ "monster_variable_change_name" ][ index2 ] cost_result_tmp[ "change_variable_val" ] = monster_effect[ "monster_variable_change_val" ][ index2 ] cost_result_tmp[ "change_variable_how" ] = monster_effect[ "monster_variable_change_how" ][ index2 ] cost_result_tmp["place_unique_id"] = user_decks[ index3 ]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["variable"]["deck"].append( cost_result_tmp ) return_value["monsters"].append(cost_result_tmp) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result if cost == 0: if not self.check_not_effected( user_decks[index3], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): tmp2 = {} tmp2["det"] = user_decks[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[ index3 ]["place_unique_id"] relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(tmp2) return_value["monsters2"].append( relation_monster[-1] ) user_decks[index3] = self.copy_monster_det( user_decks[index3], relation_monster, monster_effect, effect_kind, ) else: cost_result = self.cost_result if not self.check_not_effected( user_decks[index3], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "deck" not in cost_result["copy"]: cost_result["copy"]["deck"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp[ "copy_monster" ] = relation_monster cost_result_tmp[ "place_unique_id" ] = user_decks[index3]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["deck"].append( cost_result_tmp ) cost_result_tmp["det"] = user_decks[index3] return_value["monsters"].append( cost_result_tmp ) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.decks[deck_id]["mydeck"] = user_decks elif mine_or_other2 == 2: self.decks[deck_id]["otherdeck"] = user_decks else: self.decks[deck_id]["commondeck"] = user_decks continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: for index2 in range(len(user_decks[range_i]["variables"])): if not self.check_not_effected( user_decks[range_i], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, cost, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_decks[range_i]: user_decks[range_i]["eternal"] = [] user_decks[range_i]["eternal"].append( change_val_eternal ) else: cost_result = self.cost_result cost_result_tmp = {} cost_result_tmp[ "change_variable" ] = change_val_eternal cost_result_tmp["place_unique_id"] = user_decks[ range_i ]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["variable"]["deck"].append( cost_result_tmp ) self.cost_result = cost_result if cost == 0: if not self.check_not_effected( user_decks[range_i], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_decks[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "deck" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_decks[range_i][ "place_unique_id" ] relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(tmp2) return_value["monsters2"].append( relation_monster[-1] ) user_decks[range_i] = self.copy_monster_det( user_decks[range_i], relation_monster, monster_effect, effect_kind, ) else: cost_result = self.cost_result if not self.check_not_effected( user_decks[range_i], chain_user, effect_kind, "deck", deck_id, 0, 0, mine_or_other, ): cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "deck" not in cost_result["copy"]: cost_result["copy"]["deck"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp[ "copy_monster" ] = relation_monster cost_result_tmp["place_unique_id"] = user_decks[ range_i ]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["deck"].append( cost_result_tmp ) cost_result_tmp["det"] = user_decks[range_i] return_value["monsters"].append(cost_result_tmp) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result cost_result = self.cost_result if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.decks[deck_id]["mydeck"] = user_decks elif mine_or_other2 == 2: self.decks[deck_id]["otherdeck"] = user_decks else: self.decks[deck_id]["commondeck"] = user_decks elif place_tmp[0] == "grave": chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_grave_with_effect( self.graves[deck_id]["mygrave"], monster_effect_det, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other3, cost, ) org_grave = self.graves[deck_id]["mygrave"] elif mine_or_other2 == 2: tmp_grave = self.get_grave_with_effect( self.graves[deck_id]["othergrave"], monster_effect_det, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other3, cost, ) org_grave = self.graves[deck_id]["othergrave"] else: tmp_grave = self.get_grave_with_effect( self.graves[deck_id]["commongrave"], monster_effect_det, effect_kind, exclude, effect_user, "grave", deck_id, 0, 0, mine_or_other3, cost, ) org_grave = self.graves[deck_id]["commongrave"] user_graves = org_grave if not tmp_grave: return if "move_how" not in monster_effect_det: for index3 in range(len(user_graves)): if not self.check_not_effected( user_graves[index3], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): if cost == 0: if not self.check_not_effected( user_graves[index3], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_graves[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[index3][ "place_unique_id" ] relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(tmp2) return_value["monsters2"].append( relation_monster[-1] ) user_graves[index3] = self.copy_monster_det( user_graves[index3], relation_monster, monster_effect, effect_kind, ) else: cost_result = self.cost_result if not self.check_not_effected( user_graves[index3], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "grave" not in cost_result["copy"]: cost_result["copy"]["grave"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp[ "copy_monster" ] = relation_monster cost_result_tmp[ "place_unique_id" ] = user_graves[index3]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["grave"].append( cost_result_tmp ) cost_result_tmp["det"] = user_graves[index3] return_value["monsters"].append( cost_result_tmp ) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_graves[index3]: user_graves[index3]["eternal"] = [] user_graves[index3]["eternal"].append( change_val_eternal ) else: cost_result = self.cost_result cost_result_tmp = {} cost_result_tmp[ "change_variable" ] = change_val_eternal cost_result_tmp[ "place_unique_id" ] = user_graves[index3]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["variable"]["deck"].append( cost_result_tmp ) self.cost_result = cost_result self.cost_result = cost_result if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.graves[deck_id]["mygrave"] = user_graves elif mine_or_other2 == 2: self.graves[deck_id]["othergrave"] = user_graves else: self.graves[deck_id]["commongrave"] = user_graves continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: for index2 in range(len(user_graves[range_i]["variables"])): if not self.check_not_effected( user_graves[range_i], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_graves[range_i]: user_graves[range_i]["eternal"] = [] user_graves[range_i]["eternal"].append( change_val_eternal ) else: cost_result = self.cost_result cost_result_tmp = {} cost_result_tmp[ "change_variable" ] = change_val_eternal cost_result_tmp[ "place_unique_id" ] = user_graves[range_i]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result_tmp["deck_id"] = deck_id cost_result["variable"]["grave"].append( cost_result_tmp ) self.cost_result = cost_result if cost == 0: if not self.check_not_effected( user_graves[range_i], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_graves[range_i] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "grave" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_graves[range_i][ "place_unique_id" ] relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append( user_graves[range_i] ) return_value["monsters2"].append( relation_monster[-1] ) user_graves[range_i] = self.copy_monster_det( user_graves[range_i], relation_monster, monster_effect, effect_kind, ) else: cost_result = self.cost_result if not self.check_not_effected( user_graves[range_i], chain_user, effect_kind, "grave", deck_id, 0, 0, mine_or_other, ): cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "grave" not in cost_result["copy"]: cost_result["copy"]["grave"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp[ "copy_monster" ] = relation_monster cost_result_tmp[ "place_unique_id" ] = user_graves[range_i]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["grave"].append( cost_result_tmp ) cost_result_tmp["det"] = user_graves[range_i] return_value["monsters"].append(cost_result_tmp) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.graves[deck_id]["mygrave"] = user_graves elif mine_or_other2 == 2: self.graves[deck_id]["othergrave"] = user_graves else: self.graves[deck_id]["commongrave"] = user_graves elif place_tmp[0] == "hand": chain_user = json.loads(duel.chain_user) effect_user = chain_user[str(duel.chain - 1)] if tmp_deck is None: if (place_tmp[2] == "1" and effect_user == 1) or ( place_tmp[2] == "2" and effect_user != 1 ): mine_or_other = 1 elif (place_tmp[2] == "1" and effect_user != 1) or ( place_tmp[2] == "2" and effect_user == 1 ): mine_or_other = 2 else: mine_or_other = 3 if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: tmp_deck = self.get_hand_with_effect( self.hands[deck_id]["myhand"], monster_effect_det, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other3, cost, ) org_hand = self.hands[deck_id]["myhand"] elif mine_or_other2 == 2: tmp_hand = self.get_hand_with_effect( self.hands[deck_id]["otherhand"], monster_effect_det, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other3, cost, ) org_hand = self.hands[deck_id]["otherhand"] else: tmp_hand = self.get_hand_with_effect( self.hands[deck_id]["commonhand"], monster_effect_det, effect_kind, exclude, effect_user, "hand", deck_id, 0, 0, mine_or_other3, cost, ) org_hand = self.hands[deck_id]["commonhand"] user_hands = org_hand if not tmp_hand: return if "move_how" not in monster_effect_det: for index3 in range(len(user_hands)): if not self.check_not_effected( user_hands[index3], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): if cost == 0: if not self.check_not_effected( user_hands[index3], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): tmp2 = {} tmp2["det"] = user_hands[index3] tmp2["mine_or_other"] = mine_or_other tmp2["user"] = chain_user tmp2["place"] = "hand" tmp2["deck_id"] = deck_id tmp2["x"] = 0 tmp2["y"] = 0 tmp2["place_unique_id"] = user_hands[index3][ "place_unique_id" ] relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) return_value["monsters"].append(tmp2) return_value["monsters2"].append( relation_monster[-1] ) user_hands[index3] = self.copy_monster_det( user_hands[index3], relation_monster, monster_effect, effect_kind, ) else: cost_result = self.cost_result if not self.check_not_effected( user_hands[index3], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): cost_result = self.cost_result if "copy" not in cost_result: cost_result["copy"] = {} if "hand" not in cost_result["copy"]: cost_result["copy"]["hand"] = [] cost_result_tmp = {} relation_monster = self.get_as_monster( monster_effect["copy_monster"] ) cost_result_tmp[ "copy_monster" ] = relation_monster cost_result_tmp[ "place_unique_id" ] = user_hands[index3]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["copy"]["hand"].append( cost_result_tmp ) cost_result_tmp["det"] = user_hands[index3] return_value["monsters"].append( cost_result_tmp ) return_value["monsters2"].append( relation_monster[-1] ) self.cost_result = cost_result for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_hands[index3]: user_hands[index3]["eternal"] = [] user_hands[index3]["eternal"].append( change_val_eternal ) else: cost_result = self.cost_result cost_result_tmp = {} cost_result_tmp[ "change_variable" ] = change_val_eternal cost_result_tmp["place_unique_id"] = user_hands[ index3 ]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result["variable"]["deck"].append( cost_result_tmp ) self.cost_result = cost_result self.cost_result = cost_result if cost == 0: if (place_tmp[2] == "1" and effect_user == self.user) or ( place_tmp[2] == "2" and effect_user != self.user ): mine_or_other2 = 1 elif (place_tmp[2] == "1" and effect_user != self.user) or ( place_tmp[2] == "2" and effect_user == self.user ): mine_or_other2 = 2 else: mine_or_other2 = 3 if mine_or_other2 == 1: self.hands[deck_id]["myhand"] = user_hands elif mine_or_other2 == 2: self.hands[deck_id]["otherhand"] = user_hands else: self.hands[deck_id]["commonhand"] = user_hands continue elif monster_effect_det["move_how"] == 0: range_det = range(0, min_equation_number) elif monster_effect_det["move_how"] == 1: range_det = range( len(tmp_deck) - min_equation_number, len(tmp_deck) ) else: range_det = [] for range_tmp in range(min_equation_number): range_flag = True while range_flag is True: rand_i = random.randrange(len(tmp)) range_i = tmp[rand_i] if range_i not in range_det: range_det.append(range_i) range_flag = False for range_i in range_det: for index2 in range(len(user_hands[range_i]["variables"])): if not self.check_not_effected( user_hands[range_i], chain_user, effect_kind, "hand", deck_id, 0, 0, mine_or_other, ): for index2 in range( len(monster_effect["monster_variable_change_how"]) ): variable_name = monster_effect[ "monster_variable_change_name" ][index2] if cost == 0: if change_val_eternal is not None: if "eternal" not in user_hands[range_i]: user_hands[range_i]["eternal"] = [] user_hands[range_i]["eternal"].append( change_val_eternal ) else: cost_result = self.cost_result cost_result_tmp = {} cost_result_tmp[ "change_variable" ] = change_val_eternal cost_result_tmp["place_unique_id"] = user_hands[ range_i ]["place_unique_id"] cost_result_tmp["user"] = int(place_tmp[2]) cost_result_tmp["deck_id"] = deck_id cost_result_tmp["deck_id"] = deck_id cost_result["variable"]["hand"].append( cost_result_tmp ) self.cost_result = cost_result if cost == 0: if not self.check_not_effected( user_hands[range_i], chain_user, effect_kind, "hand", deck_id, 0, 0