extends Control const AUCTION_CARD = preload("res://scene/auction_card.tscn") var auction_card_arr:Array=[null,null,null] @export var texture_arr:Array[Texture2D]=[] @export var scale_parameter:float=0.5 var now_index:int=0: set(val): now_index=val if now_index!=now_auction_item_ind: %out_price_btn.disable(true) else: %out_price_btn.disable(false) update_out_price() pass # Called when the node enters the scene tree for the first time. func _ready() -> void: pass # Replace with function body. func init_texture(): for i in %card_add_pos.get_children(): i.queue_free() now_index=0 auction_card_arr[1]=AUCTION_CARD.instantiate() %card_add_pos.add_child(auction_card_arr[1]) auction_card_arr[1].set_item_texture(texture_arr[0]) auction_card_arr[1].global_position=%center_mask.global_position auction_card_arr[1].size=%center_mask.size auction_card_arr[1].modulate.a=1 if texture_arr.size()>1: auction_card_arr[2]=AUCTION_CARD.instantiate() %card_add_pos.add_child(auction_card_arr[2]) auction_card_arr[2].set_item_texture(texture_arr[0]) auction_card_arr[2].global_position=%right_mark.global_position-%center_mask.size*scale_parameter/2 auction_card_arr[2].size=%center_mask.size*scale_parameter auction_card_arr[2].set_item_texture(texture_arr[1]) auction_card_arr[2].modulate.a=1 pass func left(): if now_index>0: now_index-=1 var before_center_card:AuctionCard=auction_card_arr[1] before_center_card.move_size_to(%right_mark.global_position-%center_mask.size*scale_parameter/2,%center_mask.size*scale_parameter,false) var before_left=auction_card_arr[0] if before_left is AuctionCard: before_left.move_size_to(%center_mask.global_position,%center_mask.size,false) if auction_card_arr[2]!=null: var rightcard=auction_card_arr[2] as AuctionCard rightcard.move_size_to(%right_out_mark.global_position-%center_mask.size*scale_parameter/2,%center_mask.size*scale_parameter,true) auction_card_arr.pop_back() if now_index>0: var new_card:AuctionCard=AUCTION_CARD.instantiate() %card_add_pos.add_child(new_card) new_card.global_position=%left_out_mark.global_position-%center_mask.size*scale_parameter/2 new_card.size=%center_mask.size*scale_parameter new_card.move_size_to(%left_mark.global_position-%center_mask.size*scale_parameter/2,%center_mask.size*scale_parameter,false) new_card.set_item_texture(texture_arr[now_index-1]) auction_card_arr.push_front(new_card) else: auction_card_arr.push_front(null) func right(): if now_index void: if timer.is_stopped(): %time.hide() else: %time.show() %time.text=str(int(timer.time_left)) pass #决策 #已知这个人有钱x,当前竞拍物品标准价值y,人物需要程度z(0-1),当前竞拍价格a,最小加价b func auction_bid_decision(x:int, y:int, z:float, a:int, b:int,t=0.7): var p_max:int=int(y*(1+z)) if a+b>=p_max ||a+b>x: return null var r=randf() if r>t: if randf()>0.5: return null else: var res:int= randi_range(a+b,p_max) if res>x: return null else: return res else: return a+b func _on_test_pressed() -> void: set_npc_arr_and_item_arr([Database.get_npc_data("npc_01"),Database.get_npc_data("npc_02")],[Database.get_item_data("item_01"),Database.get_item_data("item_02")]) pass # Replace with function body. #本场参与拍卖的NPC字典数组 var npc_arr:Array=[] #本场物品数组 var item_arr:Array=[] #随机需求数组 var npc_need_item_arr:Array=[] var now_auction_item_ind:int=0: set(val): now_auction_item_ind=val if now_index!=now_auction_item_ind: %out_price_btn.disable(true) else: %out_price_btn.disable(false) #报价历史数组 #[[[npc序列,价格],[npc序列(玩家为-1),价格]....],...] var auction_price_arr:Array=[[]] #最小加价 var min_price_add:int=10 func start_turn(): var res_arr=auction_price_arr[now_auction_item_ind] var now_item=item_arr[now_auction_item_ind] for i in npc_arr.size(): var now_price:int=0 if res_arr.size()==0: now_price=now_item["price"]/2 else: now_price=res_arr[res_arr.size()-1][1] var npc_data=npc_arr[i] var out_price=auction_bid_decision(npc_data["gold"],now_item["price"],npc_need_item_arr[i][now_auction_item_ind],now_price,min_price_add) if out_price!=null: res_arr.append([i,out_price]) timer.start(30) update_out_price() const AUCTION_LABEL = preload("res://scene/auction_label.tscn") func update_out_price(): for i in %label_add_pos.get_children(): i.queue_free() var res_arr if now_index=0: str+=npc_arr[i[0]]["name"] else: str+="我" new_label.add_theme_color_override("font_color",Color.GREEN) if i[1]<0: str+="拍下了此物品" else: str+=(":出价"+str(i[1])) pass new_label.text=str %label_add_pos.add_child(new_label) pass func set_npc_arr_and_item_arr(npc_arr:Array,item_arr:Array): npc_need_item_arr.clear() auction_price_arr=[[]] self.npc_arr=npc_arr self.item_arr=item_arr #填写随机需求 for i in npc_arr.size(): npc_need_item_arr.append([]) for j in item_arr: npc_need_item_arr[i].append(randf_range(0.5,1)) now_auction_item_ind=0 start_turn() timer.start() texture_arr.clear() for i in item_arr: texture_arr.append(Database.get_texture(i["texture"])) init_texture() pass @onready var timer: Timer = $Timer func _on_timer_timeout() -> void: timer.stop() var res_arr=auction_price_arr[now_auction_item_ind] if res_arr.size()!=0: var left_arr=res_arr[res_arr.size()-1] var left_ind:int=left_arr[0] var left_price:int=left_arr[1] if left_ind<0: Global.add_item_to_bag(item_arr[now_auction_item_ind]) Global.change_currency_game(1,-left_price) pass else: add_item_to_npc(item_arr[now_auction_item_ind],npc_arr[left_ind]) res_arr.append([left_ind,-1]) pass if now_index==now_auction_item_ind: right() now_auction_item_ind+=1 if now_auction_item_ind void: var price=%price_edit.value var res_arr=auction_price_arr[now_auction_item_ind] var now_item=item_arr[now_auction_item_ind] var now_price:int=0 if res_arr.size()==0: now_price=now_item["price"]/2 else: now_price=res_arr[res_arr.size()-1][1] if price-now_price>=min_price_add and price<=Global.get_currency_game(1): res_arr.append([-1,price]) timer.stop() update_out_price() start_turn() timer.start(30) pass # Replace with function body. func get_now_item(): if now_index void: _on_timer_timeout() pass # Replace with function body. signal close func _on_close_pressed() -> void: self.hide() close.emit() timer.stop() pass # Replace with function body. func _on_bag_pressed() -> void: %warehouse.show() %warehouse.fresh() timer.paused=true pass # Replace with function body. func _on_warehouse_close() -> void: timer.paused=false pass # Replace with function body.